__Setattr__ zur Laufzeit überschreiben
Ich versuche das zu überschreiben__setattr__
Methode einer Python-Klasse, da ich jedes Mal, wenn ein Instanzattribut seinen Wert ändert, eine andere Funktion aufrufen möchte. Ich möchte dieses Verhalten jedoch nicht in der__init__
Methode, da ich während dieser Initialisierung einige Attribute festgelegt habe, die später verwendet werden sollen:
Bisher habe ich diese Lösung, ohne sie zu überschreiben__setattr__
zur Laufzeit:
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)
Diese möchte ich jedoch vermeidenobject.__setattr__(...)
und überschreiben__setattr__
am Ende von__init__
Methode:
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)
Ich habe es mit versuchtself.__dict__['__setitem__'] = self.aux
undobject.__setitem__['__setitem__'] = self.aux
, aber keiner dieser Versuche hat Wirkung. ich habe gelesenDieser Abschnitt der Datenmodellreferenz, aber es sieht aus wie die Zuordnung der eigenen__setattr__
ist ein bisschen knifflig.
Wie könnte es möglich sein, zu überschreiben__setattr__
am Ende von__init__
, oder zumindest eine pythonische Lösung haben, wo__setattr__
wird auf die normale weise nur im konstruktor aufgerufen?