Es scheint beliebt zu sein, über das Selbst von Python2 / 3 zu sprechen. Ich versuche auch, die Frische zu verleihen.
class class1(object):
def method1(self):
pass
Sie können dieses Skript so ausführen, wie es ist, aber ich empfehle, verschiedene Dinge mit repl auszuprobieren. Dieses Skript funktioniert sowohl mit python2 / 3 als auch mit der Ausgabe von python2 (da es etwas primitiver und intuitiver ist, habe ich es auch aufgenommen.
Anfänger sind verwirrt, aber in Python kann hier nur Klasse 1 als "Klassenobjekt" bezeichnet werden. Diese Klasse 1 kann mit repl bestätigt werden. Typ (Klasse1) == "Typ".
print(class1) # <class '__main__.class1'>
print(type(class1)) # <type 'type'>
Dies wird in docs.python deutlich unterschieden.
9 . Klassen - Python 3 \ .8 \ .3 Dokumentation
Mit anderen Worten, was in der "Klassendefinition" gesehen wurde, war genau genommen die Erstellung einer Typtypinstanz.
Wenn Sie hier einige Antworten für Klasse1 versuchen, können Sie sehen, dass Methode1 auch in diesem Zustand aufgerufen werden kann. Diese sind vom Typ Instanzmethode und ungebunden. Das heißt, es ist nicht an eine Instanz gebunden.
print(callable(class1)) # True
print(callable(class1.method1)) # True
print(class1.method1) # <unbound method class1.method1>
print(type(class1.method1)) # <type 'instancemethod'>
In diesem Zustand müssen Sie also self angeben, um die Instanz anzugeben.
Erstellen Sie eine Instanz.
instance1 = class1()
print(instance1) # <__main__.class1 object at 0x7f19f6368910>
Instanz1 wird als Instanzobjekt bezeichnet.
9 . Klassen - Python 3 \ .8 \ .3 Dokumentation
Was passiert mit Methode1 in Instanz1?
print(instance1.method1) # <bound method class1.method1 of <__main__.class1 object at 0x7f19f6368910>>
print(callable(instance1.method1)) # True
print(type(instance1.method1)) # <type 'instancemethod'>
print(instance1.method1 == class1.method1) # True
Es ist immer noch eine Instanzmethode, aber wenn ich mir repl anschaue, ist sie gebunden. Da es über das Instanzobjekt aufgerufen wird, ist klar, dass es mit instance1 verknüpft ist.
Unter dieser Bedingung ergänzt python2 / 3 das erste Argument ohne Erlaubnis. Das wird selbst. Deshalb.
Übrigens ist es nur eine Konvention, dieses "Selbst" zu nennen, und "das" funktioniert gut.
Da die Python-Funktion nur eine Instanzmethode ist, kann sie außerhalb der Klasse / Instanz zugewiesen werden.
func1 = instance1.method1
print(func1) # <bound method class1.method1 of <__main__.class1 object at 0x7f4b663e6910>>
Im Ausdruck auf der rechten Seite ist klar, dass Instanz1 gebunden ist, sodass func1 ohne Argumente aufgerufen werden kann.
Wie oben erwähnt
Beide sind intern vom Typ Instanzmethode, und das Verhalten auf der Funktionsseite hat sich nicht geändert. Der Anrufer passt das Buch an.
Da es selten vorkommt, class1.method1 direkt aufzurufen, muss in Erwartung der Ausführung vom Instanzobjekt self hinzugefügt werden.
Natürlich gibt es auch statische Methoden in anderen Sprachen. Sie können die Methodenargumente entfernen, aber es gibt einen sichereren Weg. Es ist ein Klassenmethoden-Dekorateur.
class class2(object):
def method1(cls):
print(cls)
@classmethod
def method2(cls):
print(cls)
print(class2.method1) # <unbound method class2.method1>
print(class2.method2) # <bound method type.method2 of <class '__main__.class2'>>
In der Phase von Klasse2 ist Methode2 bereits an Klasse2 gebunden. Dies ist weiterhin verfügbar, wenn es von einer Instanz aufgerufen wird.
instance2 = class2()
print(instance2.method1) # <bound method class2.method1 of <__main__.class2 object at 0x7f33073ed950>>
print(instance2.method2) # <bound method type.method2 of <class '__main__.class2'>>
Wie wäre es basierend auf dem oben genannten? Scheint das Selbst, das ich für störend hielt, nicht sehr wichtig zu sein?
Recommended Posts