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.

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.answerhet attribuutanswerop de huidige instantie;betekent
self.prompthet attribuutpromptop 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.