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

Data オブジェクト自体のタイムスタンプへの参照が必要になります。オブジェクト間に暗黙の「所有権」はありません。それらは明示的にリンクされているため (通常は、あるオブジェクトに別のオブジェクトへの参照を与えることによって) のみリンクされています。以下に 2 つの方法を示します。

まず、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

どちらを使用するか (そして、他の方法があると確信しています) はあなた次第です。何らかの理由でログのタイムスタンプが変更された場合、最初の例ではデータのタイムスタンプが変更されていることが示されますが、2 番目の例ではそうではありません...

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」と出力されます。2 番目の方法を使用して実装すると、ログ オブジェクトの作成時にタイムスタンプが「コピー」されたため、「9:50」と出力されます。この場合、Data オブジェクトには独自のタイムスタンプのコピーが含まれます。

于 2013-03-11T17:43:08.307 に答える
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 に答える