python对象可以具有嵌套属性吗?

python对象可以具有嵌套属性吗?,python,object,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 fro

我有一个对象定义如下

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'
回溯(最近一次呼叫最后一次):
文件“object_property.py”,第13行,在
a、 第1号提案
AttributeError:“非类型”对象没有属性“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

如果你愿意进入包装器对象的黑暗世界,你可能会想做什么就做什么,但它不会像一个基本属性那样整洁。就像@qwwqwq的答案一样,您可以让
obj.prop_a
返回一个具有自己
@属性的类的实例
修饰函数
prop_b

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


而不是考虑通过代码> Obj.App.Apv.PosibB/代码>可以访问的东西,可以通过一个直接在<代码> OBJ 中的属性或方法来公开,例如<代码> Obj.PrimaAyb。我想你会发现这样的设计更好。

这不是问题中提出的“嵌套属性”,属性必须返回第二个属性。简单地在第一个属性中声明第二个属性并不能使其成为属性。@ValekHalfHeart:返回属性对象不起作用。您需要返回一个包含属性对象的类的实例。您认为如果没有这些技巧,Style属性及其属性的设计会更好吗?