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'

我想弄清楚的是我是否可以为对象定义嵌套属性?

回溯是因为您的属性没有 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

如果你愿意进入包装对象的阴暗世界,也许可以做你想做的事,但它不会像基本属性那样整洁。就像@qwwqwwq的答案一样,你可以obj.prop_a返回一个类的实例,该类具有自己的@property修饰函数prop_b

您甚至可以在 prop_a 函数中声明该类,如果您不担心它可以从外部世界访问。但是,对于任何复杂的事情,它很快就会变得混乱。

相反,请考虑您希望通过obj.prop_a.prop_b访问的内容是否可以通过属性或方法直接在obj上更好地公开,例如obj.prop_a_b。我怀疑你会以这种方式找到更好的设计。

相关内容

  • 没有找到相关文章

最新更新