2015-04-01 126 views
0

我是新來的Python,所以請原諒,如果我已經瞥見了一些簡單的事情做到這一點。Python對象與@屬性的字典

我有一個這樣的對象:

class myObject(object): 
    def __init__(self): 
     self.attr1 = None 
     self.attr2 = None 

    @property 
    def prop1(self): 
     return foo.some_func(self.attr1) 

而且我實例是這樣的:

a = myObject() 
a.attr1 = 'Apple' 
a.attr2 = 'Banana' 

而且方法這一切都包裹在預計字典的回報,所以我這樣做:

return a.__dict__ 

prop1不包含在退貨中。我明白這是爲什麼,它不在對象的__dict__中,因爲它只包含真實屬性。

所以現在的問題是,怎樣才能讓我的收益率,這樣的事情:

{'attr1': 'Apple', 'attr2': 'Banana', 'prop1': 'ModifiedApple'} 

以外的迴歸做對前:

a.prop1_1 = a.prop1 
+3

爲什麼不在你的類中添加一個新的方法,該方法返回一個'self .__ dict__'的副本並添加了屬性值? – 2015-04-01 14:27:59

+0

@MartijnPieters這可能會解決這個特定情況,但不能解決查找任意對象的屬性值的一般情況。 – 2015-04-01 14:49:26

+0

@NickBailey:API經常使用屬性,因爲檢索值可能會有些昂貴,並且計算值會被推遲,直到您真正需要它爲止。如果你真的需要的話,你可以自動發現類中的所有「屬性」對象,但是*一般情況下,如果你不知道它們用於什麼,那麼捅所有屬性並不是一個好主意。 – 2015-04-01 14:51:11

回答

1

你應該離開__dict__是,只將它用於直接住在實例屬性。

如果您需要製作具有屬性名稱和值的字典,這些都包含屬性,你可以只添加,產生一個新的dicitonary另一個屬性或方法:

@property 
def all_attributes(self): 
    return dict(vars(self), prop1=self.prop1) 

這可能與內省檢測自動化所有屬性對象,但考慮到您使用屬性來避免必須首先進行計算;觸發所有屬性的計算可能並不是所有需要的。

1

你想要什麼inspect模塊。

a = myObject() 
a.attr1 = 'Apple' 
a.attr2 = 'Banana' 
inspect.getmembers(a) 

回報

[('attr1','Apple'),('attr2','Banana'),('prop1','ModifiedApple')...] 

注意getmembers也將返回內置成員一樣__sizeof__,所以你可能需要一點濾波應用到列表中。

如果你想把它當作一本字典,你可以隨時使用

dict(inspect.getmembers(a)) 
相關問題