====== LU04b - Konstruktor in Dataclass ====== In einer Dataclass wird der Konstruktor anhand der Attribute automatisch generiert. Falls Sie eigene Zusicherungen im ===== Konstruktor ===== In einer ''@dataclass'' definieren wir die Attribute mit ihren Datentypen. Python erzeugt automatisch einen Konstruktor mit allen Parametern und Wertzuweisungen. ==== Beispiel ==== @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 ===== Zusicherungen und Programmlogik ===== 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. ==== Beispiel ==== 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') ===== Attribute ohne Initialwert ===== Jenachdem können Klassen Attribute haben, deren Werte nicht durch den Aufrufer gesetzt werden. Solche Attribute können mit ''field(init=False)'' ausgeschlossen werden. ==== Beispiel ==== @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 ---- {{tag>M320-LU04}} [[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Marcel Suter