Могут ли объекты 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 атрибуту 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.prop_a.prop_b obj , который вы хотите получить через obj.prop_a.prop_b через свойство или метод непосредственно на obj , например obj.prop_a_b . Я подозреваю, что вы найдете гораздо лучший дизайн таким образом.