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__?

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top