我试图找出一种方法来获取属性本身拥有属性的对象。这个例子基本上就是我想要做的。有什么想法吗?
import random
class Data(object):
def __init__(self, index):
self.index = index
self.val = random.random()
class Log(object):
def __init__(self):
self.timestamp = '09:50'
self.data = []
for i in range(0, 20, 5):
self.data.append(Data(i))
def get_timestamp_from_data(data):
pass
log = Log()
cur_data = log.data[2]
data_timestamp = get_timestamp_from_data(cur_data)
答案 0 :(得分:2)
无法完成。
在python对象中并不真正拥有其他对象。因此,您的data
不归日志所有。该对象仅存储对列表的引用。多个对象可以引用该列表。列表本身不会跟踪谁引用它。因此无法从列表中返回Log
。
答案 1 :(得分:0)
没有内置方法可以做到这一点,因为任何数量的引用都可以引用对象。但是,让孩子对象成为父母的引用仍然很容易。
class Data(object):
def __init__(self, index, parent_obj=None):
self.index = index
self.parent_obj = parent_obj # Refer back to the log (or whatever!)
self.val = random.random()
class Log(object):
def __init__(self):
self.timestamp = '09:50'
self.data = [Data(i, self) for i in range(0, 20, 5)]
def get_timestamp_from_data(data):
try:
return data.parent_obj.timestamp
except AttributeError:
print 'data is not associated with a log'
return None # Obviously error handling is up to you.
log = Log()
cur_data = log.data[2]
data_ts = get_timestamp_from_data(cur_data)
print data_ts # Prints 09:50
答案 2 :(得分:0)
您需要引用Data对象本身的时间戳。对象之间没有隐含的“所有权”。它们只是链接在一起,因为你明确地这样做(通常通过给一个对象引用另一个对象)。这有两种方法:
首先,通过添加对Log对象的引用...
class Data(object):
def __init__(self, log, index):
self.log = log
self.index = index
self.val = random.random()
@property
def timestamp(self):
return self.log.timestamp
class Log(object):
def __init__(self):
self.timestamp = '09:50'
self.data = []
for i in range(0, 20, 5):
self.data.append(Data(self, i))
def get_timestamp_from_data(data):
return data.timestamp
...和另一个,将时间戳复制到Data对象......
class Data(object):
def __init__(self, index, timestamp):
self.index = index
self.timestamp = timestamp
self.val = random.random()
class Log(object):
def __init__(self):
self.timestamp = '09:50'
self.data = []
for i in range(0, 20, 5):
self.data.append(Data(self.timestamp, i))
def get_timestamp_from_data(data):
return data.timestamp
您使用的(我确定还有其他方法)取决于您。请注意,如果由于任何原因时间戳在Log中发生更改,则第一个示例将显示数据中的时间戳更改,但在第二个示例中,它不会...
log = Log()
cur_data = log.data[2]
print(log.timestamp) # Prints '09:50'
log.timestamp = '10:00'
print(log.timestamp) # Prints '10:00'
print(cur_data.timestamp)
如果您使用我提供的第一个样本,则最后一行将打印“10:00”,因为数据是从日志中的参考中检索的。如果使用第二种方式实现,则将打印“9:50”,因为时间戳是在创建日志对象时“复制”的。在这种情况下,Data对象将包含其自己的时间戳的副本。