Wir nehmen eine einfache Vektor-Klasse:
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
Wir möchten eine Methode haben, die die Länge berechnet. Wie sähe es aus, wenn wir sie innerhalb der Klasse definieren würden?
def length(self):
return math.sqrt(self.x ** 2 + self.y ** 2)
Wie sähe es aus, wenn wir sie als globale Methode/Funktion definieren würden?
def length_global(vector):
return math.sqrt(vector.x ** 2 + vector.y ** 2)
Also bleibt die gesamte Struktur gleich. Wie können wir das nutzen? Wenn wir kurz annehmen, dass wir keine length
Methode für unsere Vector
Klasse geschrieben hätten, könnten wir Folgendes tun:
Vector.length_new = length_global
v = Vector(3, 4)
print(v.length_new()) # 5.0
Dies funktioniert, weil der erste Parameter von length_global
als der self
Parameter in length_new
verwendet werden kann. Dies wäre ohne ein explizites self
nicht möglich.
Ein weiterer Weg, um die Notwendigkeit des expliziten self
zu verstehen, ist zu sehen, wo Python etwas syntaktischen Zucker hinzufügt. Wenn man bedenkt, dass im Grunde genommen ein Aufruf wie
v_instance.length()
intern in
Vector.length(v_instance)
umgewandelt wird, ist leicht zu erkennen, wo das self
passt. In Python schreibt man eigentlich keine Instanzmethoden; was man schreibt, sind Klassenmethoden, die eine Instanz als ersten Parameter entgegennehmen müssen. Daher müssen Sie den Instanzparameter irgendwo explizit platzieren.