Python ist nicht eine Nachricht basierend OO System . Stattdessen werden Eigenschaften ähnlich wie in JavaScript in First-Class-Funktionen aufgelöst und dann aufgerufen. Das Verhalten unterscheidet sich ein wenig in der Mechanik, wie entdeckt.
In Python ist das Erfordernis, dass Verfahren zumindest einen Parameter haben, normalerweise self
genannt, die geliefert werden automatisch die zugeordnete Instanz wenn es als eine Methode aufgerufen wird.
Darüber hinaus (und vielleicht zu dem Punkt der Frage) unterscheidet Python nicht zwischen der Verwendung von def f..
oder f = some_func()
beim Erstellen von Instanzelementbindungen; Wohl passt das Verhalten außerhalb von Klassen.
In dem Beispiel wird durch die Zuweisung der Funktion an die Instanz erwartet, dass sie wie eine Instanzmethode behandelt wird. Es ist die exakt gleiche - parameterlose - Funktion in beiden Fällen genannt; nur die zukünftige Verwendung von solchen ist relevant.
Jetzt, im Gegensatz zu JavaScript, behandelt Python Methoden und Objektverknüpfungen durch das Konzept der gebundenen Methoden - Funktionen, die als Methoden aufgelöst werden, sind immer 'gebunden'.
Das Verhalten von a.f
, das eine gebundene Methode zurückgibt - Funktion, die das gebundene Objekt automatisch an den ersten Parameter als self
liefert - erfolgt unabhängig von der Quelle der Funktion. In diesem Fall bedeutet dies, dass die parameterlose Funktion nicht verwendet werden kann, wenn sie "gebunden" ist, da sie keinen Parameter self
akzeptiert.
Als Demonstration wird im Folgenden auf die gleiche Art und Weise fehlschlagen, da die Quelle zugrunde liegende Methode macht nicht die Mindestanforderungen an die Annahme der Instanz als Argument erfüllen:
g = a.f
g()
In diesem Fall ruft g()
ist entspricht dem Aufruf func(a)
.
Zum Vergleich, Java, C#, Ruby und SmallTalk sind Nachricht basierte OO-Systeme - in dieser Aufgabe gesagt wird ein Verfahren durch einen ‚Namen‘ aufzurufen, anstatt ein Verfahren zum Auflösen (oder Funktion) als Wert, der aufgerufen werden kann.