2013-07-29 197 views
3

我有一個對象定義如下python對象可以嵌套屬性嗎?

class a(): 
    @property 
    def prop(self): 
     print("hello from object.prop") 
     @property 
     def prop1(self): 
      print("Hello from object.prop.prop") 

當我打電話

>>> obj = a() 
>>> obj.prop 
hello from object.prop 
>>> obj.prop.prop 

我得到以下追蹤誤差

Traceback (most recent call last): 
    File "object_property.py", line 13, in <module> 
    a.prop.prop1 
AttributeError: 'NoneType' object has no attribute 'prop1' 

什麼,我想弄清楚,如果我能在定義對象的嵌套屬性?

+1

該物業將不得不返回第二個屬性。簡單地聲明第一個屬性並不是一個屬性。 – ApproachingDarknessFish

+0

@ValekHalfHeart:返回一個屬性對象將不起作用。您需要返回包含屬性對象的類的實例。 – Blckknght

回答

6

回溯是因爲您的財產沒有return聲明,因此它返回NoneType,顯然不能擁有它自己的屬性。你的財產可能需要返回一個不同類的實例,它有自己的prop屬性。這樣的事情:

class a(): 
    def __init__(self): 
     self.b = b() 
    @property 
    def prop(self): 
     print("hello from object.prop") 
     return self.b 

class b(): 
    @property 
    def prop(self): 
     print("Hello from object.prop.prop") 

x = a() 
print x.prop.prop 
>> hello from object.prop 
>> Hello from object.prop.prop 
>> None 
+0

這不是問題中提到的「嵌套屬性」 – hago

1

一般來說,沒有辦法來包裝除自己以外的對象的屬性訪問。當然,沒有什麼可以嵌套的語法(你可以在屬性函數中聲明一個類,但它會變得很難看)。

即,在像obj.prop_a.prop_b的表達式,頂層對象obj不能直接控制與prop_b屬性訪問,這是一個不同的對象上發生會發生什麼。

舉個例子,考慮下面的語句序列:

foo = obj.prop_a 
bar = foo.prop_b 

分配給bar的價值是一樣的obj.prop_a.prop_b,但聲明沒有直接提及obj可言。

如果你願意進入包裝對象的陰暗世界,有可能做你想做的,但它不會是一個基本的財產整齊。像@ qwwqwwq的回答,您可以obj.prop_a有自己@property裝飾功能prop_b返回一個類的實例。

你甚至可以聲明類的prop_a功能裏面,如果你不擔心它是來自外部世界的訪問。對於任何複雜的事情,它會變得很快。

相反,請考慮您希望通過obj.prop_a.prop_b訪問的內容是否可以更好地通過obj上的某個媒體資源或方法展示,如obj.prop_a_b。我懷疑你會以這種方式找到更好的設計。