0%

Dataclasses und Wertobjekte · Übung

Alternative Konstruktoren bauen

Eine Klasse hat normalerweise einen Zugang: einen Aufruf mit den Feldern, die ihr Konstruktor erwartet. Echte Daten kommen oft in einer anderen nützlichen Form an.

Try it

Die Klasse erhält sich selbst

@classmethod übergibt die Klasse als erstes Argument. Nach Konvention heißt es cls.

cls(...) erzeugt ein Objekt über die Klasse, die den Aufruf erhalten hat. Fest geschriebenes Duration(...) wirkt jetzt gleichwertig. Ein geerbter Konstruktor würde damit aber die falsche Klasse erzeugen.

Was ist cls innerhalb von from_seconds?

Sinnvolle Zugänge benennen

Ein alternativer Konstruktor sollte eine erkennbare Quelle oder einen Anwendungsfall benennen:

@classmethod
def one_minute(cls):
    return cls(1, 0)

Auch Konfigurationsklassen profitieren:

@classmethod
def untimed(cls, title):
    return cls(title, time_limit=0)

Der aufrufende Code liest die Absicht, statt eine Sammlung unerklärter Werte zu wiederholen.

Verwende einen gewöhnlichen Konstruktor für den allgemeinen Fall und eine Klassenmethode für einen sinnvoll benannten Weg zum selben gültigen Objekt. Die Übung baut vier solche Wege. Hilfsfunktionen, die nichts erzeugen, sind eine eigene Entscheidung der nächsten Lektion.

Aufgabe

Ergänze vier alternative Konstruktoren mit @classmethod.

Question.from_dict(record) liest "prompt", "answer" und "points". Question.simple(prompt, answer) erzeugt eine Frage mit einem Punkt.

QuizConfig.practice(title) verwendet eine Bestehensgrenze von 0.5. QuizConfig.final_exam(title) verwendet 0.8 und ein Zeitlimit von 3600.

Jede Methode muss über cls(...) erzeugen, statt ihre Klasse beim Namen zu nennen. Die gewöhnlichen Konstruktoren behalten ihre Validierung in __post_init__. Jeder alternative Weg muss deshalb dieselben ungültigen Werte ablehnen.