python对象可以嵌套属性吗?

时间:2013-07-29 01:23:59

标签: python object

我有一个如下定义的对象

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'

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

2 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

通常,不,没有办法将自己以外的对象的属性访问包装起来。当然没有什么可以嵌套的语法(你可以在你的属性函数中声明一个类,但它很快就会变得丑陋)。

也就是说,在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。我怀疑你会用这种方式找到更好的设计。