Je eerste klassen en objecten · oefening
Laat een quiz samenwerken met vragen
De vorige les plaatste meerdere onafhankelijke objecten van Question in één lijst. We kunnen die verzameling nu aan een ander object geven dat de quiz als geheel voorstelt.
Elke Question kent haar vraagtekst, antwoord en de manier om één ingevoerd antwoord te controleren. Een Quiz heeft een andere taak: die bewaart de verzameling en selecteert welke vraag een ingevoerd antwoord moet afhandelen.
class Quiz:
def __init__(self, questions):
self.questions = questions
Het object Quiz bevat daarom een lijst waarvan de waarden objecten van Question zijn:
quiz -> Quiz
questions -> list
-> Question
-> Question
Deze opbouw heet compositie: één object wordt opgebouwd uit andere objecten die hun eigen gerichte taken behouden.
Draag het gedetailleerde werk over
Het omvattende object kan één onderdeel selecteren en dat vragen het gedetailleerde werk uit te voeren. Hergebruik het labelvoorbeeld uit eerdere lessen:
class LabelSet:
def __init__(self, labels):
self.labels = labels
def matches(self, index, text):
label = self.labels[index]
return label.matches(text)
LabelSet dupliceert de tekstvergelijkingsregel niet. Het delegeert dat werk aan het geselecteerde Label. De oefening past dezelfde samenwerking toe op Quiz en Question.
Deze verdeling geeft elke klasse een gerichte belofte:
Question.is_correct(response)controleert één vraag.Quiz.check_answer(index, response)selecteert een vraag en draagt het werk over. In de figuur betekent “Composition” compositie en “Delegation” delegatie. “Select” is selecteren; de tekst in het groene vak zegt dat elk object zijn eigen taak behoudt.

Zet de samenwerking in de juiste volgorde:
Sleep de opties in de juiste volgorde of gebruik de pijlknoppen.
Quizselecteert eenQuestionuit haar lijst.Questionvergelijkt het ingevoerde antwoord met haar antwoord.Het booleaanse resultaat keert terug naar de aanroeper.
QuizroeptQuestion.is_correct(response)aan.
Met kleine asserties kunnen we de publieke belofte controleren:
assert quiz.check_answer(0, "4")
assert not quiz.check_answer(0, "5")
De asserties geven niets om de namen van private hulpfuncties die de klassen gebruiken. Ze controleren wat de objecten beloven te doen.
Opdracht
Maak Quiz.check_answer af.
Selecteer de vraag op index en draag de antwoordcontrole daarna over aan de methode is_correct van dat object. Voer het programma uit en zorg dat beide asserties blijven slagen.