Heim >Backend-Entwicklung >Python-Tutorial >Warum verhalten sich Python-Methoden bei der Referenzgleichheit anders als Funktionen?
Enthüllung des Rätsels: Methodenreferenzgleichheit in Python
Im Bereich der Python-Programmierung kann das Konzept der Referenzgleichheit sowohl verlockend als auch sein verwirrend. Überraschenderweise zeigen Methoden im Gegensatz zu regulären Funktionen ein einzigartiges Verhalten, wenn es um Referenzgleichheit geht.
Warum dieser auffällige Unterschied? Die Antwort liegt in der Art und Weise, wie Methoden erstellt und aufgerufen werden. Im Gegensatz zu Funktionen, die unabhängig im globalen Bereich existieren, werden Methoden bei jedem Zugriff dynamisch generiert. Dies ergibt sich aus der Rolle von Funktionen als Deskriptoren in Python. Wenn die .__get__-Methode einer Funktion aufgerufen wird, wird ein Methodenobjekt zurückgegeben.
Betrachten Sie das folgende Beispiel:
<code class="python">class What: def meth(self): pass print(What.meth is What.meth) # This is False in Python 2 print(inst.meth is inst.meth) # False</code>
Der obige Code gibt für beide Szenarien False aus. Dies liegt daran, dass jeder Zugriff auf What.meth dazu führt, dass ein neues Methodenobjekt erstellt wird. Daher können diese Methodenobjekte nicht als referenzgleich betrachtet werden.
Im Gegensatz dazu sind reguläre Funktionen globale Entitäten, sodass sich func beim Aufruf immer auf dasselbe Objekt bezieht. Dies erklärt, dass das wahre Ergebnis in func func ist.
Mit Python 3.8 wurde jedoch eine deutliche Verbesserung eingeführt. Nun gelten zwei Methoden als gleich, wenn ihre Attribute .__self__ und .__func__ identische Objekte sind. Das heißt, wenn zwei Methoden dieselbe Funktion umschließen und an dieselbe Instanz gebunden sind, vergleichen sie True mit ==.
Bei Python-Versionen vor 3.8 war das Verhalten der Methode == inkonsistent. Python-Methoden und eine Art von C-Methode verglichen self auf Gleichheit, während eine andere Art von C-Methode self nach Identität verglich.
Um zu testen, ob zwei Methoden dasselbe darstellen Für die zugrunde liegende Funktion wird empfohlen, deren func-Attribute zu vergleichen:
<code class="python">print(What.meth == What.meth) # functions (or unbound methods in Python 2) print(What().meth == What().meth) # bound methods with *different* instances print(What().meth.__func__ == What().meth.__func__) # functions</code>
Das obige ist der detaillierte Inhalt vonWarum verhalten sich Python-Methoden bei der Referenzgleichheit anders als Funktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!