2013-03-11 110 views
0

我想弄清楚擁有屬性本身屬性的對象的方法。這個例子基本上是我想要做的。有任何想法嗎?擁有屬性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) 
+0

Python中沒有對象所有權的概念。每個參考都是平等的。你爲什麼認爲你需要這個? – delnan 2013-03-11 17:36:01

+1

您的示例似乎與您的問題沒有關係。 'get_timestamp_from_data'是否需要訪問'log'?爲什麼你不能只傳遞'log',或者把它關閉? – 2013-03-11 17:36:31

+0

或者你可以'收集'上層課堂中的所有對象。 [Link] [1] [1]:http://stackoverflow.com/a/9460070/2153744 – aronadaal 2013-03-11 17:47:34

回答

2

這是不能做到的。

在python對象中並不真正擁有其他對象。所以你的data不屬於日誌。該對象僅存儲對列表的引用。多個對象可以引用列表。該清單本身並沒有跟蹤誰引用它。所以沒有辦法從列表中找回Log

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 
0

您將需要一些對數據對象本身的時間戳的引用。對象之間沒有隱含的「所有權」。他們只是聯繫在一起,因爲你明確這樣做(通常通過給一個對象引用另一個對象)。這裏有兩種方法:

首先,通過向登錄對象的引用...

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 

...和另一種,其拷貝中的時間戳到數據對象...

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() 
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對象將包含它自己的時間戳的副本。