I am trying to override the __setattr__ method of a Python class, since I want to call another function each time an instance attribute changes its value. However, I don't want this behaviour in the __init__ method, because during this initialization I set some attributes which are going to be used later: So far I have this solution, without overriding __setattr__ at runtime: 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) However, I would like to avoid these object.__setattr__(...) and override __setattr__ at the end of the __init__ method: 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) I have tried with self.__dict__['__setitem__'] = self.aux and object.__setitem__['__setitem__'] = self.aux, but none of these attemps has effect. I have read this section of the data model reference, but it looks like the assignment of the own __setattr__ is a bit tricky. How could be possible to override __setattr__ at the end of __init__, or at least have a pythonic solution where __setattr__ is called in the normal way only in the constructor? Continue reading...