2013-07-29 6 views
3

Я объект определяется следующим образомМожет ли объекты 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' 

То, что я пытаюсь выяснить, если я могу определить вложенные свойства для объектов?

+1

Недвижимость должна будет вернуть второе имущество. Просто объявление второго свойства в первом не делает его атрибутом. – ApproachingDarknessFish

+0

@ValekHalfHeart: возврат объекта свойства не будет работать. Вам нужно вернуть экземпляр класса, содержащего объект свойства. – Blckknght

ответ

6

Отслеживание связано с тем, что у вашего свойства нет оператора 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 
+0

Это не «вложенное свойство», заданное в вопросе – hago

1

В общем, нет, нет возможности обернуть доступ к атрибуту объекта, кроме вас. Конечно, нет ничего с синтаксисом, который может быть вложен аккуратно (вы можете объявить класс в своей функции свойств, но он становится уродливым быстро).

То есть, в выражении типа 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. Я подозреваю, что вы найдете гораздо лучший дизайн таким образом.

Смежные вопросы