Zastępowanie __setattr__ w czasie wykonywania

Próbuję zastąpić__setattr__ metoda klasy Pythona, ponieważ chcę wywoływać inną funkcję za każdym razem, gdy atrybut instancji zmienia swoją wartość. Jednak nie chcę tego zachowania w__init__ metoda, ponieważ podczas tej inicjalizacji ustawiłem niektóre atrybuty, które będą później użyte:

Do tej pory mam to rozwiązanie, bez nadpisywania__setattr__ W czasie wykonywania:

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)

Chciałbym jednak ich uniknąćobject.__setattr__(...) i nadpisać__setattr__ na końcu__init__ metoda:

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)

Próbowałem zself.__dict__['__setitem__'] = self.aux iobject.__setitem__['__setitem__'] = self.aux, ale żaden z tych ataków nie działa. przeczytałemta sekcja odniesienia do modelu danych, ale wygląda na przypisanie własnego__setattr__ jest trochę skomplikowane.

Jak można nadpisać__setattr__ na końcu__init__lub przynajmniej mieć rozwiązanie pytoniczne gdzie__setattr__ jest wywoływany w normalny sposób tylko w konstruktorze?

questionAnswers(2)

yourAnswerToTheQuestion