Mit PEP 557 werden Datenklassen in die Python-Standardbibliothek eingeführt.
Sie verwenden den @dataclass
Dekorator und sollen "veränderbare benannte Tupel mit Standard" sein, aber ich bin mir nicht sicher, ob ich verstehe, was dies tatsächlich bedeutet und wie sie sich von üblichen Klassen unterscheiden.
Was genau sind Python-Datenklassen und wann ist es am besten, sie zu verwenden?
python
class
python-3.7
python-dataclasses
König Julian
quelle
quelle
namedtuple
s sind unveränderlich und können keine Standardwerte für die Attribute haben, während Datenklassen veränderbar sind und diese haben können.@dataclass
führt nicht dazu, dass sich die Site auflöst.namedtuples
KANN Standardwerte haben. Schauen Sie hier: stackoverflow.com/questions/11351032/…Antworten:
Datenklassen sind nur reguläre Klassen, die auf das Speichern von Status ausgerichtet sind und mehr als viel Logik enthalten. Jedes Mal, wenn Sie eine Klasse erstellen, die hauptsächlich aus Attributen besteht, haben Sie eine Datenklasse erstellt.
Das
dataclasses
Modul erleichtert das Erstellen von Datenklassen. Es kümmert sich um eine Menge Kesselplatte für Sie.Dies ist besonders wichtig, wenn Ihre Datenklasse hashbar sein muss. Dies erfordert sowohl eine
__hash__
Methode als auch eine__eq__
Methode. Wenn Sie eine benutzerdefinierte__repr__
Methode hinzufügen, um das Debuggen zu vereinfachen, kann dies sehr ausführlich werden:Mit können
dataclasses
Sie es reduzieren auf:Die gleiche Klasse decorator können auch Vergleichsverfahren (generieren
__lt__
,__gt__
usw.) und Griff Unveränderlichkeit.namedtuple
Klassen sind ebenfalls Datenklassen, aber standardmäßig unveränderlich (und auch Sequenzen).dataclasses
sind in dieser Hinsicht viel flexibler und können leicht so strukturiert werden, dass sie dieselbe Rolle wie einenamedtuple
Klasse übernehmen können .Das PEP wurde von dem
attrs
Projekt inspiriert , das noch mehr kann (einschließlich Slots, Validatoren, Konverter, Metadaten usw.).Wenn Sie einige Beispiele sehen möchten, die ich kürzlich
dataclasses
für einige meiner Advent of Code- Lösungen verwendet habe, lesen Sie die Lösungen für Tag 7 , Tag 8 , Tag 11 und Tag 20 .Wenn Sie ein
dataclasses
Modul in Python-Versionen <3.7 verwenden möchten , können Sie das zurückportierte Modul installieren (erfordert 3.6) oder dasattrs
oben erwähnte Projekt verwenden.quelle
@dataclass
generiert ungefähr dieselbe__init__
Methode mit einemquantity_on_hand
Schlüsselwortargument mit Standardwert. Wenn Sie eine Instanz erstellenquantity_on_hand
, wird immer das Instanzattribut festgelegt . Mein erstes Beispiel , das keine Datenklasse ist, verwendet dasselbe Muster, um zu wiederholen, was der generierte Code der Datenklasse bewirkt.__post_init__
Methode durch.Überblick
Die Frage wurde angesprochen. Diese Antwort fügt jedoch einige praktische Beispiele hinzu, um das grundlegende Verständnis von Datenklassen zu erleichtern.
namedtuple
und anderen .Folgendes bedeutet der letztere Satz:
namedtuple
oder eine reguläre Klasse.Im Vergleich zu herkömmlichen Klassen sparen Sie in erster Linie bei der Eingabe von Boilerplate-Code.
Eigenschaften
Dies ist eine Übersicht über Datenklassenfunktionen (TL; DR? Siehe Übersichtstabelle im nächsten Abschnitt).
Was man bekommt
Hier sind Funktionen, die Sie standardmäßig von Datenklassen erhalten.
Attribute + Darstellung + Vergleich
Diese Standardeinstellungen werden bereitgestellt, indem die folgenden Schlüsselwörter automatisch auf gesetzt werden
True
:Was Sie einschalten können
Zusätzliche Funktionen sind verfügbar, wenn die entsprechenden Schlüsselwörter festgelegt sind
True
.Auftrag
Die Bestellmethoden sind jetzt implementiert (Überladungsoperatoren :)
< > <= >=
, ähnlich wiefunctools.total_ordering
bei stärkeren Gleichheitstests.Hashable, veränderlich
Obwohl das Objekt möglicherweise veränderlich (möglicherweise unerwünscht) ist, wird ein Hash implementiert.
Hashable, unveränderlich
Ein Hash ist jetzt implementiert und das Ändern des Objekts oder das Zuweisen von Attributen ist nicht zulässig.
Insgesamt ist das Objekt hashbar, wenn entweder
unsafe_hash=True
oderfrozen=True
.Siehe auch die ursprüngliche Hashing-Logik-Tabelle mit weiteren Details.
Was du nicht bekommst
Um die folgenden Funktionen zu erhalten, müssen spezielle Methoden manuell implementiert werden:
Auspacken
Optimierung
Die Objektgröße wird jetzt reduziert:
__slots__
Verbessert unter bestimmten Umständen auch die Geschwindigkeit beim Erstellen von Instanzen und beim Zugriff auf Attribute. Außerdem erlauben Slots keine Standardzuweisungen. Andernfalls wird aValueError
angehoben.Weitere Informationen zu Slots finden Sie in diesem Blogbeitrag .
Übersichtstabelle
+ Diese Methoden werden nicht automatisch generiert und erfordern eine manuelle Implementierung in eine Datenklasse.
*
__ne__
wird nicht benötigt und ist daher nicht implementiert .Zusatzfunktionen
Nachinitialisierung
Erbe
Konvertierungen
Konvertieren Sie eine Datenklasse rekursiv in ein Tupel oder ein Diktat :
Einschränkungen
Verweise
quelle
Aus der PEP-Spezifikation :
Der
@dataclass
Generator fügt Methoden der Klasse , dass Sie anders definieren würde sich wie__repr__
,__init__
,__lt__
, und__gt__
.quelle
Betrachten Sie diese einfache Klasse
Foo
Hier ist der
dir()
eingebaute Vergleich. Auf der linken Seite befindet sich derFoo
Dekorator ohne @dataclass und auf der rechten Seite mit dem Dekorateur @dataclass.Hier ist ein weiterer Unterschied, nachdem das
inspect
Modul zum Vergleich verwendet wurde.quelle