Python (2) erfordert self, da die Methode eine Instanzmethode ist

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.

Klassenobjekt

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.

Methode von

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.

Instanzobjekt

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

Methode von

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.

Kann ersetzt werden

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.

Und selbst

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.

Statische Methoden und Klassenmethode

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'>>

Aber selbst

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

Python (2) erfordert self, da die Methode eine Instanzmethode ist
Python ist eine Instanz
Warum ist das erste Argument der [Python] -Klasse selbst?
Python ist eine Sprache für Erwachsene
Was ist eine Instanzvariable?
Ich habe einen AttributeError erhalten, als ich die offene Methode in Python verspottet habe
[Python] Was ist @? (Über Dekorateure)
[Python] Was ist der sortierte Schlüssel?
Wofür ist der Python-Unterstrich (_)?
Python> Was ist ein erweitertes Slice?
Python in ist auch ein Operator
Treffen Sie eine Methode einer Klasseninstanz mit der Python Bottle Web API
Den Namen der Methode, die ihn aufgerufen hat, finden Sie in der Python-Methode
[Einführung in Python] Wie wird mit der continue-Anweisung wiederholt?
Wo ist der Python-Instanziierungsprozess geschrieben?
Installieren von Anaconda Python auf einer ECS-Instanz
Was ist "Mahjong" in der Python-Bibliothek? ??
Entspricht die Zahl einer Ganzzahl?
[Python] [Meta] Ist der Python-Typ ein Typ?
Ändern Sie in Python das Verhalten der Methode je nach Aufruf
Was ist ein Algorithmus? Einführung in den Suchalgorithmus] ~ Python ~
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Was ist im Docker Python-Image pfeifend?
Bachstelze ist das beste CMS für Python! (Vielleicht)
Ich habe die Methode der kleinsten Quadrate in Python ausprobiert
Dynamisches Ersetzen der nächsten Methode in Python
Lernen Sie das Entwurfsmuster "Factory Method" in Python
Über den Unterschied zwischen "==" und "is" in Python
Python: Bereiten Sie einen Serializer für die Klasseninstanz vor:
Dies ist die einzige grundlegende Überprüfung von Python ~ 1 ~
Dies ist die einzige grundlegende Überprüfung von Python ~ 2 ~
[Python] Prognostizieren Sie die richtige Miete für Wohnungen
Dies ist die einzige grundlegende Überprüfung von Python ~ 3 ~
Versuchen Sie, die Monte-Carlo-Methode in Python zu implementieren
[Python] Denken Sie ernsthaft über die M-1-Gewinnmethode nach.
Ein Artikel, der die Fallstricke von Python zusammenfasst
Verwendung zum Aufrufen einer Methode einer Instanz, bevor sie von __new__ zurückgegeben wird
Ich dachte darüber nach, warum Python selbst mit dem Gefühl eines Python-Interpreters notwendig ist
Nehmen Sie eine Instanz einer Python-Ausnahmeklasse nicht direkt als Argument für die Ausnahmeklasse!