0%

Je eerste klassen en objecten · oefening

Waarnaar self verwijst

De klasse Question gebruikt self nu in zowel __init__ als is_correct. We hebben er al meerdere keren op vertrouwd, dus deze les neemt de tijd om precies te onderzoeken waarnaar het verwijst.

self is een methodeparameter voor de instantie die de huidige methodeaanroep ontvangt. Dat kan vreemd aanvoelen, omdat we die in de methodedefinitie schrijven maar niet expliciet meegeven wanneer we de gebruikelijke puntnotatie gebruiken.

Bekijk twee vragen:

first = Question("Two plus two?", "4")
second = Question("Three plus three?", "6")

first.is_correct("4")
second.is_correct("4")

Tijdens de eerste aanroep verwijst self naar first. Tijdens de tweede verwijst self naar second.

Python gedraagt zich ongeveer alsof de aanroepen zo waren geschreven:

Question.is_correct(first, "4")
Question.is_correct(second, "4")

Normaal gebruik je de duidelijkere instantievorm. De uitgewerkte vorm laat zien waar self vandaan komt. In de figuur betekent “The call” de aanroep en “Method parameters” de methodeparameters. “Returns True” betekent dat de aanroep waar teruggeeft. De tekst onderaan zegt dat self de instantie is die deze aanroep ontvangt.

Het aanroepen van first.is_correct geeft first mee als self en de string 4 als response.

De naam is een conventie met een doel

Python reserveert het woord self niet, maar Python-programmeurs gebruiken het consequent. Die conventie volgen maakt methodedefinities voor iedereen leesbaar.

Binnen een methode:

  • betekent self.answer het attribuut answer op de huidige instantie;

  • betekent self.prompt het attribuut prompt op de huidige instantie;

  • kan een andere methodeaanroep self.some_method() gebruiken.

Wat drukt dit af?

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

    def show(self):
        print(self.text)

first = Label("A")
second = Label("B")
first.show()
second.show()

Het belangrijke idee is niet dat elk object een variabele met de naam self bevat. Dat doet het niet. self is een methodeparameter die tijdelijk verwijst naar de instantie die die specifieke aanroep ontvangt.

Opdracht

Maak answer_length af zodat de methode de lengte van het antwoord van de huidige vraag teruggeeft.

Gebruik daarna Step in de oefeneditor. Volg de aanroepen voor first en second. Vergelijk in elk methodeframe self.answer met de waarde die len teruggeeft.

Als de twee instanties in het variabelenpaneel moeilijk te onderscheiden zijn, noteer dat dan als platformfeedback in plaats van te gokken wat Python deed.