Python dataclasses einfach erklärt: Weniger Boilerplate, klarer Code
Mit @dataclass erzeugt Python __init__, __repr__ und __eq__ automatisch – sauberer Code ohne Boilerplate. Für Azubis, Studenten & Berufseinsteiger!
Von Marcel Schmidtpeter 21. Sept. 2026
Stell dir vor, du schreibst in deiner Ausbildung oder im ersten Semester eine kleine Verwaltung für Kundendaten. Name, E-Mail, Kundennummer - eigentlich simple Sachen. Doch bevor du auch nur eine Zeile Logik schreibst, tippst du `__init__`, `__repr__` und `__eq__` von Hand. Drei Methoden, die fast immer gleich aussehen. Genau für diesen Fall gibt es Python dataclasses - und die sparen dir genau diese mühsame Tipp-Arbeit.
Was sind Python dataclasses?
Eine dataclass ist eine normale Python-Klasse, bei der der Dekorator `@dataclass` automatisch die Standardmethoden wie `__init__`, `__repr__` und `__eq__` für dich erzeugt. Du deklarierst nur noch die Attribute - den Rest übernimmt Python. Der Dekorator stammt aus dem Modul `dataclasses` der Standardbibliothek und ist seit Python 3.7 verfügbar (siehe offizielle Python-Dokumentation zu dataclasses).
Merke: Eine dataclass ist kein neuer Datentyp, sondern ein Generator für Methoden, die du sonst selbst schreiben müsstest.
Warum ist das sinnvoll? Weil Klassen, die hauptsächlich Daten halten (Kunden, Artikel, Messwerte), fast immer dieselben Methoden brauchen. Sich wiederholenden Code ohne echten Mehrwert nennt man übrigens Boilerplate - und genau den reduziert die dataclass drastisch.
Wie sieht der Unterschied im Code aus?
Ohne dataclass schreibst du für eine einfache Klasse so etwas:
class Kunde:
def __init__(self, name, email, kundennummer):
self.name = name
self.email = email
self.kundennummer = kundennummer
def __repr__(self):
return f"Kunde(name={self.name!r}, email={self.email!r}, kundennummer={self.kundennummer!r})"
def __eq__(self, other):
if not isinstance(other, Kunde):
return NotImplemented
return (self.name, self.email, self.kundennummer) == (
other.name,
other.email,
other.kundennummer,
)Rund 15 Zeilen - und das für drei Attribute. Mit dataclass reicht:
from dataclasses import dataclass
@dataclass
class Kunde:
name: str
email: str
kundennummer: intVier Zeilen, gleiche Funktionalität. Die Methoden werden automatisch beim Definieren der Klasse erzeugt. Falls du wissen willst, was diese sogenannten Dunder-Methoden (Methoden mit doppelten Unterstrichen) im Detail tun, haben wir dazu einen eigenen Artikel zu Python Dunder-Methoden.
Merke: `@dataclass` erzeugt standardmäßig `__init__`, `__repr__` und `__eq__` - ohne dass du eine Zeile davon schreibst.
Wichtig zu wissen: Die Angaben hinter dem Doppelpunkt (z.B. `str`) sind Typannotationen. Die dataclass braucht sie, um zu wissen, welche Felder die Klasse hat. Python prüft die Typen zur Laufzeit allerdings nicht - sie sind Hinweise für dich, deine IDE und Tools wie mypy. Details findest du in der Python-Dokumentation zum typing-Modul und in unserem Artikel zu Typannotationen und Generics in Python.
Wie funktionieren Default-Werte und Pflichtfelder?
Jedes Feld mit einem Default-Wert muss nach den Feldern ohne Default-Wert stehen - genau wie bei normalen Funktionsparametern. Und wenn du eine veränderliche Liste als Standardwert brauchst, kommt `field()` ins Spiel:
from dataclasses import dataclass, field
@dataclass
class Bestellung:
bestellnummer: int
kunde: str
positionen: list = field(default_factory=list) # neue Liste pro Objekt
def add_position(self, artikel: str):
self.positionen.append(artikel)Warum `default_factory=list` statt einfach `positionen: list = []`? Weil Python sonst eine einzige Liste für alle Objekte teilt - ein klassischer Fehler, der dich Stunden kosten kann. Mit `default_factory` wird bei jedem neuen Objekt eine frische Liste erzeugt.
Merke: Veränderliche Standardwerte wie Listen oder Dictionaries gehören immer in `field(default_factory=...)` - nie direkt als `= []` oder `= {}`.
Praxisbeispiel: Eine kleine Lagerverwaltung
Hier ein vollständiges, lauffähiges Beispiel, wie du es ähnlich in einem Übungsprojekt oder der Abschlussprüfung antreffen könntest:
from dataclasses import dataclass, field
@dataclass
class Artikel:
artikelnummer: str
bezeichnung: str
preis: float
bestand: int = 0
@dataclass
class Lager:
name: str
artikel: list = field(default_factory=list)
def add(self, neuer_artikel: Artikel):
self.artikel.append(neuer_artikel)
def gesamtbestand(self) -> int:
return sum(a.bestand for a in self.artikel)
# Nutzung
lager = Lager(name="Hauptlager")
lager.add(Artikel("A-001", "USB-Kabel", 9.99, 42))
lager.add(Artikel("A-002", "Maus", 24.50, 15))
print(lager.artikel[0])
# Artikel(artikelnummer='A-001', bezeichnung='USB-Kabel', preis=9.99, bestand=42)
print(lager.gesamtbestand())
# 57
print(
Artikel("A-001", "USB-Kabel", 9.99, 42)
== Artikel("A-001", "USB-Kabel", 9.99, 42)
)
# True -- __eq__ wurde automatisch erzeugtBeachte die Ausgaben: Das `print()` zeigt automatisch eine saubere Darstellung, und der Vergleich zweier Artikel mit gleichen Werten liefert `True`. Beides kostet dich null Zeilen Extra-Code.
Welche Optionen bietet @dataclass?
Parameter | Wirkung | Typischer Anwendungsfall |
`@dataclass(frozen=True)` | Objekt ist unveränderlich (immutable) | Werte, die sich nie ändern dürfen (z.B. Koordinaten) |
`@dataclass(order=True)` | erzeugt `<`, `<=`, `>`, `>=` | Objekte sortieren, siehe Objekte sortieren mit sorted |
`@dataclass(eq=True, repr=False)` | steuert einzelne Methoden | `__repr__` selbst definieren |
`field(default_factory=...)` | frischer Standardwert pro Objekt | Listen, Dictionaries als Felder |
Mit `frozen=True` wird aus der dataclass ein Wert, den du nach der Erstellung nicht mehr ändern kannst - ähnlich wie ein Tuple. Jeder Schreibversuch wirft dann eine `FrozenInstanceError`-Exception. Wer mehr über unveränderliche Datentypen lernen will, liest am besten auch unseren Überblick zu Python Collections.
Welche Fehler passieren bei dataclasses häufig?
1. Mutable Defaults direkt zuweisen
# FALSCH -- alle Objekte teilen sich dieselbe Liste!
@dataclass
class Team:
mitglieder: list = []
# RICHTIG
@dataclass
class Team:
mitglieder: list = field(default_factory=list)Im falschen Fall landen Mitglieder, die du bei Objekt A hinzufügst, auch in Objekt B. Python selbst wirft bei dieser Schreibweise in dataclasses übrigens direkt einen `ValueError` - einer der wenigen Fälle, wo dich die Standardbibliothek aktiv schützt.
2. Felder ohne Default nach Feldern mit Default
# FALSCH -- TypeError: non-default argument follows default argument
@dataclass
class Person:
name: str = "Unbekannt"
alter: int # Pflichtfeld nach Default-Feld geht nicht
# RICHTIG -- Pflichtfelder zuerst
@dataclass
class Person:
alter: int
name: str = "Unbekannt"3. Typannotationen als Typprüfung missverstehen
`preis: float` garantiert nicht, dass nur Zahlen gespeichert werden. `Artikel("A-1", "Kabel", "gratis", 3)` läuft ohne Fehler durch. Die Annotation ist eine Dokumentation, keine Validierung - ein Unterschied, der in Prüfungen gern abgefragt wird.
Übungstipp: Baue deine eigene dataclass
Nimm dir zehn Minuten und modelliere etwas aus deinem Alltag: deinen Stundenplan, deine Spotify-Playlists oder den Bestand deines Kühlschranks. Erstelle eine dataclass mit mindestens drei Feldern, einem Default-Wert und einer Methode. Teste danach drei Dinge: Was gibt `print()` aus? Ergeben zwei identische Objekte beim `==`-Vergleich `True`? Was passiert bei `frozen=True`, wenn du ein Attribut änderst?
Wer die Methoden `__init__` und `__eq__` einmal selbst von Hand geschrieben hat, versteht den Wert der dataclass deutlich besser - schreib also vorher eine "handgemachte" Version und vergleiche sie anschließend.
FAQ: Häufige Fragen zu Python dataclasses
Was ist der Unterschied zwischen einer dataclass und einer normalen Klasse?
Technisch keiner - eine dataclass ist eine normale Klasse. Der Dekorator `@dataclass` schreibt nur automatisch die Methoden `__init__`, `__repr__` und `__eq__` in die Klasse hinein. Du kannst dataclasses erweitern, Methoden hinzufügen und vererben wie gewohnt.
Ab welcher Python-Version gibt es dataclasses?
Seit Python 3.7 (2018). Wenn du eine ältere Version nutzt, steht `@dataclass` nicht zur Verfügung - in der Praxis heute aber kaum noch relevant, da Python 3.7 bereits das Ende seiner Unterstützung erreicht hat.
Wann sollte ich KEINE dataclass verwenden?
Wenn die Klasse mehr Logik als Daten enthält. Eine dataclass mit 15 Methoden und zwei Feldern ist ein Warnsignal - dann ist sie eher Dienst (Service) als Datenhalter und eine herkömmliche Klasse ist passender.
Kann ich mit dataclasses auch JSON serialisieren?
Ja, mit `dataclasses.asdict()` wandelst du ein Objekt in ein Dictionary um. Für echtes JSON kannst du das Ergebnis an `json.dumps()` übergeben. Details zum Arbeiten mit Dictionaries findest du in unserem Artikel zum Python Dictionary.
Sind dataclasses langsamer als handgeschriebene Klassen?
Nein, zur Laufzeit praktisch nicht. Der generierte Code wird einmalig beim Definieren der Klasse erzeugt und ist danach identisch schnell wie selbst geschriebener Code.
Fazit
Python dataclasses ersparen dir genau den Code, den du bei datenhaltenden Klassen ohnehin immer gleich schreibst: `__init__`, `__repr__` und `__eq__`. Weniger Boilerplate bedeutet weniger Fehlerquellen und lesbarere Klassen - gerade wenn du in der Ausbildung, im Studium oder im ersten Job größere Projekte strukturierst. Die wichtigsten Parameter `frozen`, `order` und `field(default_factory=...)` solltest du im Schlaf beherrschen.
Wenn du bei OOP-Konzepten, Python-Grundlagen oder Prüfungsvorbereitung Unterstützung brauchst: Wir von study-it.education unterstützen Azubis, Studenten und Berufseinsteiger mit individueller IT-Nachhilfe - auch zu Themen wie dataclasses, Vererbung und sauberem Klassendesign. Schau vorbei und melde dich für dein kostenloses Erstgespräch an.
1:1-Hilfe zu diesem Thema?
Brauchst du jemand, der das mit dir durchgeht?
Statt nochmal lesen: 30 min mit einem Senior-Dev.
Kostenloses Erstgespräch buchen →
Mit @dataclass erzeugt Python __init__, __repr__ und __eq__ automatisch – sauberer Code ohne Boilerplate. Für Azubis, Studenten & Berufseinsteiger!
marcel.schmidtpeter@study-it.education →Mehr Lesestoff
Python HTTP requests senden: GET, POST & mehr mit requests
So sendest du mit der Python-Bibliothek requests GET- und POST-Anfragen an APIs – mit Beispielen für Azubis, Studenten und Berufseinsteiger.
Python JSON verarbeiten mit dem -Modul – einfach erklärt
JSON in Python lesen und schreiben? Das -Modul macht's einfach – von .loads bis .dumps, hier lernst du alles Wichtige.
Python Datenbank verbinden: sqlite3 & SQLAlchemy einfach erklärt
Erfahre, wie du Python per sqlite3 oder SQLAlchemy mit Datenbanken verbindest – mit Praxisbeispielen für Azubis, Studenten & Berufseinsteiger.