[英]Can python objects have nested properties?
我有一個對象定義如下
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'
我想弄清楚是否可以為對象定義嵌套屬性?
回溯是因為您的屬性沒有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
一般來說,不,除了你自己之外,沒有辦法包裝對象的屬性訪問。 當然,沒有什么語法可以整齊地嵌套(您可以在屬性函數中聲明一個類,但它會很快變得丑陋)。
也就是說,在像obj.prop_a.prop_b
這樣的表達式中,頂級對象obj
無法直接控制prop_b
屬性訪問發生的情況,這發生在不同的對象上。
例如,考慮以下語句序列:
foo = obj.prop_a
bar = foo.prop_b
分配給bar
的值與obj.prop_a.prop_b
相同,但該語句根本沒有直接引用obj
。
如果您願意進入 wrapper 對象的陰暗世界,也許可以做您想做的事,但它不會像基本屬性那樣整潔。 就像在@qwwqwwq 的答案中一樣,您可以讓obj.prop_a
返回一個具有自己的@property
裝飾函數prop_b
的類的實例。
如果您不擔心可以從外部訪問它,您甚至可以在prop_a
函數中聲明該類。 不過,對於任何復雜的事情,它都會很快變得一團糟。
相反,請考慮是否可以通過直接在obj
上的屬性或方法更好地公開您希望通過obj.prop_a.prop_b
訪問的內容,例如obj.prop_a_b
。 我懷疑您會通過這種方式找到更好的設計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.