0

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

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)
4

3 回答 3

2

这是不可能的。

在 python 中,对象并不真正拥有其他对象。所以你data不属于日志。该对象仅存储对列表的引用。多个对象可以引用该列表。该列表本身不会跟踪谁引用了它。所以没有办法Log从列表中返回。

于 2013-03-11T17:37:37.863 回答
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
于 2013-03-11T17:41:03.070 回答
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 对象将包含其自己的时间戳的副本。

于 2013-03-11T17:43:08.307 回答