拥有属性python的访问对象

时间:2013-03-11 17:31:36

标签: python

我试图找出一种方法来获取属性本身拥有属性的对象。这个例子基本上就是我想要做的。有什么想法吗?

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)

3 个答案:

答案 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对象将包含其自己的时间戳的副本。