簡體   English   中英

python對象可以有嵌套屬性嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM