EMZETT.
Login

Python: Dataclasses

Kurz: Ein @dataclass erzeugt für eine Klasse, die vor allem Daten hält, automatisch __init__, __repr__ und Vergleiche. Das spart viel Standardcode.

Genauer: Statt Konstruktor und Textdarstellung von Hand zu schreiben, listet man nur die Felder mit Typen auf.

Im Detail

from dataclasses import dataclass, field
 
@dataclass
class Produkt:
    name: str
    preis: float
    tags: list[str] = field(default_factory=list)
  • Automatisch: Produkt("Tasse", 4.5) funktioniert, print(p) zeigt Produkt(name='Tasse', preis=4.5, tags=[]), == vergleicht Feld für Feld.
  • Standardwerte: Veränderliche Standardwerte (Listen, Dicts) nie direkt setzen, sondern field(default_factory=list).
  • Optionen: frozen=True macht Objekte unveränderlich und hashbar, order=True erzeugt Sortiervergleiche, slots=True spart Speicher.
  • __post_init__: Läuft nach dem Konstruktor, etwa für Prüfungen oder abgeleitete Felder.
  • Hilfen: asdict(p) und replace(p, preis=5) (Kopie mit Änderung).
  • Vergleich: NamedTuple ist unveränderlich und tupelartig, dict ohne feste Struktur, Pydantic prüft zusätzlich zur Laufzeit.

Siehe auch: Type Hints