Ich habe eine Klasse, die Objekte aus Zeilen aufbläst, die in einer Datenbank (oder einer anderen Quelle, z. B. MongoDB, einer CSV-Datei usw.) gefunden wurden. Um die Eigenschaften des Objekts festzulegen, wird etwas wie self.__dict__.update(**properties)
oder ausgeführt obj.__dict__.update(**properties)
.
Wird dies als pythonisch angesehen? Ist dies ein gutes Muster, das ich weiterhin verwenden sollte, oder wird dies als schlechte Form angesehen?
Antworten:
In Python 3.3 wurde ein neuer Typ hinzugefügt, der
types.SimpleNamespace()
in der Dokumentation folgendermaßen beschrieben wird:Beachten Sie die
__init__
Methode des Typs; Sie können keine bessere Bestätigung für die Technik erhalten als die Python-Dokumentation.quelle
SimpleNamespace
unterscheidet sich jedoch von den meisten Typen darin, dass es keine festen Attribute hat.__dict__
. Dies ist das Wörterbuch, das die Symboltabelle des Moduls enthält. Wenn Sie dieses Wörterbuch ändern, wird das Symbol des Moduls geändert Tabelle, aber eine direkte Zuordnung zu dem__dict__
Attribut ist nicht möglich (Sie können schreibenm.__dict__['a'] = 1
, wasm.a
1 bedeutet, aber nichtwritem.__dict__ = {}
). Direkte Änderungen__dict__
werden nicht empfohlen . "Aus diesem Grund habe ich diese Frage anfangs gestellt.globals()
Funktion gibt den gleichen Namespace zurück, und es gibt normalerweise bessere Möglichkeiten, Probleme zu lösen, als Globals dynamisch festzulegen, daher die Warnung.