Могут ли объекты 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'
Я пытаюсь выяснить, могу ли я определить вложенные свойства для объектов?
- создать список объектов в Cython
- Доступ к объектам python внутри объектов в Python
- Создать объект из нескольких списков
- Вызвать метод родительского класса из дочернего класса в Python?
- Класс экземпляров сохраняет ссылки
Отслеживание связано с тем, что у вашего свойства нет оператора 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
. Я подозреваю, что вы найдете гораздо лучший дизайн таким образом.
- Определение диапазона значений, возвращаемых хешем Python ()
- получить все элементы из списка списков в строках по 5
- Почему параметр cmp удален из sort / sorted в Python3.0?
- Форсировать создание нового объекта памяти python
- python – Когда WebSocketHandler и TornadoWebSocketClient полностью удалены?
- Я не могу понять, почему я получаю AttributeError
- Создайте копию списка, не ссылающегося на содержащиеся объекты
- Предпочтительно ли возвращать анонимный класс или объект для использования в качестве «структуры»?
- Можно ли загрузить объект в память на FTP с помощью Python?
- Я хотел бы создать mock-объект в python
- Получение объектов JSON из текстового файла (с использованием Python)