0%

Deine ersten Klassen und Objekte · Übung

Worauf self verweist

Die Klasse Question verwendet self jetzt sowohl in __init__ als auch in is_correct. Wir haben uns bereits mehrmals darauf gestützt. Deshalb nehmen wir uns in dieser Lektion Zeit, genau zu untersuchen, worauf es verweist.

self ist ein Methodenparameter für die Instanz, die den aktuellen Methodenaufruf empfängt. Das kann ungewohnt wirken, weil wir ihn in die Methodendefinition schreiben, bei der üblichen Punktnotation aber nicht ausdrücklich übergeben.

Betrachte zwei Fragen:

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

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

Während des ersten Aufrufs verweist self auf first. Während des zweiten Aufrufs verweist self auf second.

Python verhält sich ungefähr so, als wären die Aufrufe so geschrieben:

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

Normalerweise verwendest du die klarere Instanzform. Die ausgeschriebene Form zeigt, woher self kommt.

Der Aufruf first.is_correct übergibt first als self und den String 4 als response.

Der Name ist eine Konvention mit einem Zweck

Python reserviert das Wort self nicht, aber Python-Programmierer verwenden es einheitlich. Diese Konvention beizubehalten macht Methodendefinitionen für alle lesbar.

Innerhalb einer Methode:

  • bedeutet self.answer das Attribut answer der aktuellen Instanz;

  • bedeutet self.prompt das Attribut prompt der aktuellen Instanz;

  • kann ein weiterer Methodenaufruf self.some_method() verwenden.

Was gibt dieser Code aus?

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()

Die wichtige Idee ist nicht, dass jedes Objekt eine Variable namens self enthält. Das tut es nicht. self ist ein Methodenparameter, der vorübergehend auf die Instanz verweist, die diesen bestimmten Aufruf empfängt.

Aufgabe

Vervollständige answer_length so, dass es die Länge der Antwort der aktuellen Frage zurückgibt.

Verwende dann Step im Übungseditor. Verfolge die Aufrufe für first und second. Vergleiche in jedem Methodenaufrufrahmen self.answer mit dem Wert, den len zurückgibt.

Wenn das Variablenpanel die Unterscheidung der beiden Instanzen erschwert, notiere das als Rückmeldung zur Plattform, statt zu raten, was Python getan hat.