In einer Dataclass wird der Konstruktor anhand der Attribute automatisch generiert. Falls Sie eigene Zusicherungen im
In einer @dataclass
definieren wir die Attribute mit ihren Datentypen.
Python erzeugt automatisch einen Konstruktor mit allen Parametern und Wertzuweisungen.
@dataclass class Member: givenname: str birth_year: int membership_fee: float
Die oben definierte Klasse erzeugt automatisch diesen Konstruktor:
... def __init__(self, givenname: str, birth_year: int, membership_fee: float): self.givenname = givenname self.birth_year = birth_year self.membership_fee = membership_fee
Manche Klassen verlangen nach expliziten Zusicherungen oder Logik beim Erzeugen eines Objekts.
Anstatt den Konstruktor von Hand zu schreiben, nutzen wir dafür die Methode post_init()
.
Diese Methode, sofern vorhanden, wird am Ende des Konstruktors aufgerufen.
In unserem Beispiel wollen wir sicherstellen, dass der Mitgliederbeitrag nicht negativ sein kann.
... def __post_init__(self): if self.membership_fee < 0: raise ValueError('membership_fee may not be a negative value')
Jenachdem können Klassen Attribute haben, deren Werte nicht durch den Aufrufer gesetzt werden.
Solche Attribute können mit field(init=False)
ausgeschlossen werden.
@dataclass class Member: givenname: str birth_year: int membership_fee: float = field(init=False)
In diesem Beispiel können beim Erzeugen (Instatiieren) eines Objekts nur der Vorname und das Geburtsjahr angegeben werden. Der generierte Konstruktor sieht entsprechend so aus:
... def __init__(self, givenname: str, birth_year: int): self.givenname = givenname self.birth_year = birth_year