Ist es möglich, ein Objekt aus einem Wörterbuch in Python so zu erstellen, dass jeder Schlüssel ein Attribut dieses Objekts ist?
Etwas wie das:
d = { 'name': 'Oscar', 'lastName': 'Reyes', 'age':32 }
e = Employee(d)
print e.name # Oscar
print e.age + 10 # 42
Ich denke, es wäre so ziemlich das Gegenteil dieser Frage: Python-Wörterbuch aus den Feldern eines Objekts
python
dictionary
properties
attributes
initialization
OscarRyz
quelle
quelle
def __init__(self,**initial_data)
Sie den zusätzlichen Vorteil einer Init-Methode, die auch Schlüsselwortargumente ausführen kann (z. B. "e = Mitarbeiter (Name = 'Oscar')" oder einfach ein Wörterbuch aufnehmen (z. B. "e = Mitarbeiter (") ** diktieren) ").Employee(some_dict)
derEmployee(**some_dict)
APIs und der APIs ist inkonsistent. Was besser ist, sollte geliefert werden.()
anstatt setzenNone
, können Sie dies folgendermaßen tun :def __init__(self, iterable=(), **kwargs): self.__dict__.update(iterable, **kwargs)
.[[setattr(self,key,d[key]) for key in d] for d in some_dict]
AddressNotFoundError
(um in diesem Fall korrigierte Daten zurückzugeben, anstatt sie in(object) ['x' => 'y']
die Luft zuDas Festlegen von Attributen auf diese Weise ist mit ziemlicher Sicherheit nicht der beste Weg, um ein Problem zu lösen. Entweder:
Sie wissen, was alle Felder im Voraus sein sollten. In diesem Fall können Sie alle Attribute explizit festlegen. Das würde so aussehen
oder
Sie wissen nicht, was alle Felder im Voraus sein sollten. In diesem Fall sollten Sie die Daten als Diktat speichern, anstatt einen Objektnamespace zu verschmutzen. Attribute sind für den statischen Zugriff. Dieser Fall würde so aussehen
Eine andere Lösung, die im Wesentlichen Fall 1 entspricht, ist die Verwendung von a
collections.namedtuple
. Siehe Vans Antwort, wie man das umsetzt.quelle
Sie können mit auf die Attribute eines Objekts zugreifen
__dict__
und die Aktualisierungsmethode dafür aufrufen:quelle
__dict__
ist ein Implementierungsartefakt und sollte nicht verwendet werden. Dies ignoriert auch die Existenz von Deskriptoren in der Klasse.__dict__
ist ein dokumentierter Teil der Sprache, kein Implementierungsartefakt.setattr
ist dem__dict__
direkten Zugriff vorzuziehen . Sie müssen viele Dinge im Auge behalten, die dazu führen können, dass Sie__dict__
nicht da sind oder nicht das tun, was Sie wollen, wenn Sie es verwenden__dict__
, aber essetattr
ist praktisch identisch mit dem tatsächlichen Tunfoo.bar = baz
.__dict__
abgeraten wird: docs.python.org/tutorial/classes.html#id2Warum nicht einfach Attributnamen als Schlüssel für ein Wörterbuch verwenden?
Sie können mit benannten Argumenten, einer Liste von Tupeln oder einem Wörterbuch oder einzelnen Attributzuweisungen initialisieren, z.
Anstatt den Attributfehler auszulösen, können Sie alternativ None für unbekannte Werte zurückgeben. (Ein Trick, der in der web2py-Speicherklasse verwendet wird)
quelle
Ich denke, dass die Verwendung von Antworten der richtige
settattr
Weg ist, wenn Sie wirklich Unterstützung benötigendict
.Wenn das
Employee
Objekt jedoch nur eine Struktur ist, auf die Sie mit dot syntax (.name
) anstelle von dict syntax (['name']
) zugreifen können, können Sie namedtuple wie folgt verwenden :Sie haben zwar eine
_asdict()
Methode, um auf alle Eigenschaften als Wörterbuch zuzugreifen, können jedoch später, nur während der Erstellung, keine zusätzlichen Attribute hinzufügen.quelle
sagen zum Beispiel
wenn Sie die Attribute sofort festlegen möchten
quelle
a.__dict__.update(x=100, y=300, z="blah")
Ähnlich wie bei der Verwendung eines Diktats können Sie auch kwargs wie folgt verwenden:
quelle