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?