0%

Je eerste klassen en objecten · oefening

Maak geldige vraaginstanties

De eerste klasse Question gaf ons een nieuw soort waarde, maar garandeerde nog niet dat een vraag compleet was. We maakten een lege instantie en voegden de attributen achteraf toe:

question = Question()
question.prompt = "What does len('cat') return?"
question.answer = "3"

Omdat die stappen los stonden, was het makkelijk om te vroeg te stoppen en het antwoord weg te laten:

question = Question()
question.prompt = "What does len('cat') return?"

Niets vereiste de tweede toewijzing. We losten het probleem van afwijkende sleutels op, maar maakten een vergelijkbaar probleem met onvolledige objecten.

Om elk object tijdens het aanmaken zijn begintoestand te geven, kan een klasse een speciale methode met de naam __init__ definiëren. Ga verder met het voorbeeld Label uit de vorige les:

class Label:
    def __init__(self, text, color):
        self.text = text
        self.color = color

Python roept __init__ aan wanneer een nieuwe instantie wordt gemaakt:

label = Label(
    "Question 1",
    "blue",
)

De twee argumenten geven de beginwaarden mee. Binnen __init__ worden die waarden als attributen op het nieuwe object opgeslagen. De oefening past dit constructorpatroon toe op Question.

Lees self voorlopig als “deze instantie”. We bekijken het uitgebreid nadat de klasse nog een methode heeft.

Eén klasse, meerdere objecten

Dezelfde klasse kan veel onafhankelijke instanties maken:

first = Label("Question 1", "blue")
second = Label("Question 2", "green")

Beide objecten hebben hetzelfde type en dezelfde attribuutnamen. Hun attribuutwaarden kunnen verschillen. In de figuur betekent “One class” één klasse en “One definition” één definitie. “First instance” en “Second instance” zijn de eerste en tweede instantie, elk met eigen waarden voor tekst en kleur.

Eén klasse Label maakt twee onafhankelijke instanties, elk met eigen tekst en kleur.

Wat drukt dit af?

class Label:
    def __init__(self, text, color):
        self.text = text
        self.color = color

first = Label("Question 1", "blue")
second = Label("Question 2", "green")
print(first.color)
print(second.color)

Constructorargumenten verplicht stellen valideert niet elke mogelijke string. Het zorgt er wel voor dat elk normaal aangemaakt object met dezelfde betrouwbare attributen begint. Hoofdstuk 5 voegt sterkere regels voor een geldige toestand toe.

Opdracht

Maak __init__ af zodat elke nieuwe vraag haar eigen prompt en answer bewaart.

Voer het programma uit. Je moet de eerste vraagtekst en het tweede antwoord op afzonderlijke regels zien.