0%

Deine ersten Klassen und Objekte · Übung

Lass ein Quiz mit Fragen zusammenarbeiten

Die vorige Lektion hat mehrere unabhängige Question-Objekte in eine Liste gesetzt. Wir können diese Sammlung jetzt einem anderen Objekt geben, das das Quiz als Ganzes darstellt.

Jedes Question kennt seinen Fragetext, seine Antwort und die Art, eine eingegebene Antwort zu prüfen. Ein Quiz hat eine andere Aufgabe: Es hält die Sammlung und wählt, welche Frage eine eingegebene Antwort behandeln soll.

class Quiz:
    def __init__(self, questions):
        self.questions = questions

Das Quiz-Objekt enthält daher eine Liste, deren Werte Question-Objekte sind:

quiz -> Quiz
        questions -> list
                     -> Question
                     -> Question

Diese Anordnung heißt Komposition: Ein Objekt wird aus anderen Objekten aufgebaut, die ihre eigenen klar begrenzten Aufgaben behalten.

Delegiere die Detailarbeit

Das enthaltende Objekt kann ein Element auswählen und es die Detailarbeit erledigen lassen. Verwende das Beschriftungsbeispiel aus früheren Lektionen erneut:

class LabelSet:
    def __init__(self, labels):
        self.labels = labels

    def matches(self, index, text):
        label = self.labels[index]
        return label.matches(text)

LabelSet wiederholt die Regel zum Textvergleich nicht. Es delegiert diese Arbeit an das ausgewählte Label. Die Übung wendet dieselbe Zusammenarbeit auf Quiz und Question an.

Diese Aufteilung gibt jeder Klasse eine klar begrenzte Zusage:

  • Question.is_correct(response) prüft eine Frage.

  • Quiz.check_answer(index, response) wählt eine Frage aus und delegiert.

Ein Quiz enthält Question-Objekte und delegiert die Antwortprüfung an ein ausgewähltes Question.

Bringe die Zusammenarbeit in die richtige Reihenfolge:

Ziehe die Optionen in die richtige Reihenfolge oder verwende die Pfeiltasten.

  • Quiz ruft Question.is_correct(response) auf.

  • Quiz wählt ein Question aus seiner Liste aus.

  • Question vergleicht die eingegebene Antwort mit seiner Antwort.

  • Das boolesche Ergebnis kehrt zum Aufrufer zurück.

Kleine Zusicherungen lassen uns die öffentliche Zusage prüfen:

assert quiz.check_answer(0, "4")
assert not quiz.check_answer(0, "5")

Den Zusicherungen ist egal, welche privaten Hilfsnamen die Klassen verwenden. Sie prüfen, was die Objekte zu tun versprechen.

Aufgabe

Vervollständige Quiz.check_answer.

Wähle die Frage an index aus und delegiere dann die Antwortprüfung an die Methode is_correct dieses Objekts. Führe das Programm aus und halte beide Zusicherungen erfolgreich.