Я пытаюсь переопределить метод __setattr__
класса Python, так как я хочу вызывать другую функцию каждый раз, когда атрибут экземпляра меняет свое значение. Однако я не хочу этого поведения в методе __init__
, потому что во время этой инициализации я устанавливаю некоторые атрибуты, которые будут использоваться позже:
Пока у меня есть это решение без переопределения __setattr__
во время выполнения:
class Foo(object):
def __init__(self, a, host):
object.__setattr__(self, 'a', a)
object.__setattr__(self, 'b', b)
result = self.process(a)
for key, value in result.items():
object.__setattr__(self, key, value)
def __setattr__(self, name, value):
print(self.b) # Call to a function using self.b
object.__setattr__(self, name, value)
Однако я хотел бы избежать этих object.__setattr__(...)
и переопределить __setattr__
в конце метода __init__
:
class Foo(object):
def __init__(self, a, b):
self.a = a
self.b = b
result = self.process(a)
for key, value in result.items():
setattr(self, key, value)
# override self.__setattr__ here
def aux(self, name, value):
print(self.b)
object.__setattr__(self, name, value)
Я пробовал с self.__dict__['__setitem__'] = self.aux
и object.__setitem__['__setitem__'] = self.aux
, но ни один из этих attemps не имеет эффекта. Я прочитал этот раздел ссылки на модель данных, но похоже, что назначение собственного __setattr__
немного сложно.
Как можно переопределить __setattr__
в конце __init__
или, по крайней мере, иметь питоновское решение, где __setattr__
вызывается обычным способом только в конструкторе?