dataclass in Python

In Python gibt es verschieden Wege, um einfache Klassen zu erstellen, die lediglich Daten enthalten. Zwei dieser sogenannnten Data Class Builder wurden bereits in diesem Blog vorgestellt: collections.namedtuple und typing.NamedTuple. Nun folgt die dritte Möglichkeit: @dataclasses.dataclass. Dieser Artikel bietet einen kleinen Einblick in die Vorteile dieser Klasse.

Beginnen wir mit einem einfachen Beispiel:

from dataclasses import dataclass

@dataclass
class Books:
    name: str
    title: str
    year: int

Die Verwendung von dataclass erfordert zunächst eine Importanweisung.

from dataclasses import dataclass

Außerdem muss der Decorator @dataclass vorangestellt werden. Im gezeigten Beispiel wird die Klasse Books erstellt, die drei Attribute enthält: name, title und year. Dies ist das Grundgerüst, das es nun ermöglicht, Objekte zu erzeugen:

book1 = Book("Fred Herzog", "A Color Legacy", "2025")
book2 = Book("Todd Hido", "Intimate Distance", "2025")
book3 = Book("Harry Gruyaert", "Homeland", "2024")
book4 = Book("Joel Meyerowitz", "Retrospective", "2014")

Die Verwendung von print() führt bei book1 zu folgender Ausgabe:

Book(name='Fred Herzog', title='A Color Legacy', year='2025')

Dieses einfachen Beispiele zeigen bereits die Vorteile einer dataclass. Der Code kann vereinfacht werden. Denn für das Erstellen eines Objekt, nachfolgend gezeigt am Buch von Fred Herzog, müsste man ohne Verwendung von dataclass folgendes Schreiben (sofern keine init-Methode implementiert wurde):

book1 = Book()
book1.name = "Fred Herzog"
book1.title = "A Color Legacy"
book1.year = "2025"

Gleiches sehen wir bei der Ausgabe mit print(), die bei einer herkömmlichen Klasse wie folgt aussehen könnte:

<__main__.Book object at 0x105008c20>

Die Eigenschaften werden uns nämlich erst angezeigt, wenn die Methode __str__ hinzugefügt wurde:

def __str__(self):
    return f"{self.name} - {self.title} ({self.year})"

Dies führt nun zur Ausgabe der Attribute:

Fred Herzog - A Color Legacy (2025)

Eine dataclass implementiert Methoden, die wir bei herkömmlichen Klassen selbst schreiben müssten, z.B. __init__ oder __str__. Durch die Verwendung von dataclass muss also weniger Code geschrieben werden.

Wenn ihr zukünftig Klassen schreiben möchtet, die lediglich Daten enthalten sollen, solltet ihr gegebenenfalls an @dataclasses.dataclass denken, um euch das Leben zu vereinfachen.