Я пытаюсь переопределить метод __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__ вызывается обычным способом только в конструкторе?