Dataclasses en waardeobjecten · oefening
Bouw alternatieve constructors
Een klasse heeft normaal één ingang: je roept die aan met de velden die de constructor verwacht. Echte gegevens komen vaak in een andere bruikbare vorm binnen.
De klasse ontvangt zichzelf
@classmethod geeft de klasse door als eerste argument. Volgens de conventie heet dat cls.
cls(...) maakt een object aan via de klasse die de aanroep ontving. Duration(...) vast uitschrijven lijkt nu gelijkwaardig, maar een geërfde constructor zou dan een object van de verkeerde klasse maken.
Wat is cls binnen from_seconds?
Geef betekenisvolle ingangen een naam
Een alternatieve constructor hoort een herkenbare bron of gebruikssituatie te benoemen:
@classmethod
def one_minute(cls):
return cls(1, 0)
Ook configuratieklassen hebben daar baat bij:
@classmethod
def untimed(cls, title):
return cls(title, time_limit=0)
De aanroeper leest de bedoeling in plaats van een verzameling onverklaarde waarden te herhalen.
Gebruik een gewone constructor voor het algemene geval en een klassemethode voor een route met een betekenisvolle naam naar hetzelfde geldige object. De oefening bouwt vier van zulke routes. Hulpmethoden die niets aanmaken zijn een afzonderlijke beslissing voor de volgende les.
Opdracht
Voeg vier alternatieve constructors toe met @classmethod.
Question.from_dict(record) leest "prompt", "answer" en "points". Question.simple(prompt, answer) maakt een vraag van één punt.
QuizConfig.practice(title) gebruikt een slaaggrens van 0.5. QuizConfig.final_exam(title) gebruikt 0.8 en een tijdslimiet van 3600.
Elke methode moet via cls(...) een object maken, niet door de klasse bij naam te noemen. De gewone constructors behouden hun validatie in __post_init__, dus elke alternatieve route moet dezelfde ongeldige waarden weigeren.