У меня есть класс, поля которого являются экземпляром другого класса.
class Field:
def get(self):
def set(self, value):
def delete(self):
class Document:
def __init__(self):
self.y = Field()
self.z = True
Что я хотел бы сделать, так это когда экземпляр родителя ссылается на свои атрибуты, вместо этого он вызывает дочерние методы.
d = Document()
d.y = 'some value' # Calls the `set` function of the Field
d.y == 'some value' # Calls the `get` function of the Field
del d.y # Calls the `delete` function of the Field
Другая загвоздка в том, что мне нужно такое поведение только тогда, когда поле имеет тип Field
.
У меня возникают проблемы с рекурсией, попробуйте использовать __getattr__
и т.п., например:
def __getattr__(self, key):
if isinstance(getattr(self, key), Field):
return getattr(self, key).get()
return getattr(self, key)
Рекурсия довольно очевидна, почему это происходит... но как ее избежать?
Я уже видел несколько примеров на StackOverflow, но не могу понять, как это обойти.
__get__
,__set__
и__delete__
, а дескриптор задается как атрибут класса, а не экземпляра. Я бы посоветовал вам посмотреть некоторую информацию об дескрипторах (например, здесь и здесь). - person BrenBarn   schedule 23.08.2014