Python New-Style-Klasse-bezogene Frage
-
26-10-2019 - |
Frage
Ich bin ein Python -Lernender und hacke derzeit eine Klasse mit variabler Anzahl von Feldern wie in der Beispiel "Haufen genannter Stuff" Beispiel hier.
class Bunch:
def __init__(self, **kwds):
self.__dict__.update(kwds)
Ich möchte auch eine schreiben __setattr__
In dieser Klasse, um den Namen der Eingabeattribut zu überprüfen. Aber die Python -Dokumentation sagt,
Wenn __setattr __ () einem Instanzattribut zuweisen möchte, sollte es nicht einfach "self.name = value" ausführen - dies würde sich selbst einen rekursiven Anruf an sich selbst ausführen. Stattdessen sollte es den Wert in das Wörterbuch von Instanzattributen einfügen, z. B. "self .__ dict __ [name] = Wert". Für neue Klassen, anstatt auf das Instanzwörterbuch zuzugreifen, sollte es die Basisklassenmethode mit demselben Namen aufrufen, z. B. "Object .__ Setattr __ (Selbst, Name, Wert)".
In diesem Fall sollte ich auch verwenden object.__dict__
in dem __init__
Funktion zu ersetzen self.__dict__
?
Lösung
Nein, Sie sollten Ihre Klasse als definieren als class Bunch(object)
, beziehen sich aber weiterhin auf self.__dict__
.
Sie müssen nur das verwenden object.__setattr__
Methode, während Sie die definieren self.__setattr__
Methode zur Verhinderung der unendlichen Rekursion. __dict__
ist keine Methode, sondern ein Attribut für das Objekt selbst, also object.__dict__
würde nicht funktionieren.
Andere Tipps
Sie können verwenden
class Bunch:
def __init__(self, **kwds):
self.__dict__.update(kwds)
def __setattr__(self, name, value):
#do your verification stuff
self.__dict__[name] = value
oder mit neuer Klasse:
class Bunch(object):
def __init__(self, **kwds):
self.__dict__.update(kwds)
def __setattr__(self, name, value):
#do your verification stuff
super(Bunch, self).__setattr__(name, value)