Heim > Artikel > Backend-Entwicklung > Warum sind Python-Methoden nicht gleich, auch wenn sie sich auf dieselbe zugrunde liegende Funktion beziehen?
Methodenreferenzgleichheit in Python
In Python sind Methoden eindeutige Objekte, die beim Zugriff dynamisch erstellt werden. Dieses Verhalten unterscheidet sich von dem regulärer Funktionen, auf die von demselben Objekt verwiesen wird, unabhängig davon, wann sie aufgerufen werden.
Um dies zu verstehen, betrachten Sie das folgende Beispiel:
class What: def meth(self): pass What().meth is What().meth # False
In diesem Code , sind die Meth-Methoden nicht gleich, obwohl sie sich auf dieselbe zugrunde liegende Funktion beziehen. Dies liegt daran, dass jedes Meth-Objekt eine einzigartige, zur Laufzeit erstellte Instanz ist.
Der Grund für dieses Verhalten liegt im Attributsuchprozess von Python, bei dem ein Methodenobjekt durch Aufrufen der .__get__-Methode des Deskriptors (Funktion) generiert wird:
What.__dict__['meth'].__get__(What(), What)
Diese dynamische Erstellung von Methodenobjekten führt zu folgenden Beobachtungen:
Instanzen derselben Klasse haben unterschiedliche Meth-Objekte:
inst = What() inst.meth is inst.meth # False
Methoden in 不同的-Klassen sind immer unterschiedliche Objekte:
What.meth is Other.meth # False
Vor Python 3.8, Testen Methodengleichheit mit == könnte zu inkonsistenten Ergebnissen führen. Allerdings ermöglichen Python 3.8 und höher einen Gleichheitsvergleich von Methoden basierend auf ihren Attributen .___self__ und .___func__, wenn sie identisch übereinstimmen.
Um festzustellen, ob zwei Methoden dieselbe zugrunde liegende Funktion darstellen, empfiehlt es sich, einen Vergleich durchzuführen ihre .__func__-Attribute:
What.meth.__func__ == What.meth.__func__ # True What().meth.__func__ == What().meth.__func__ # True (for same instance) What().meth.__func__ == What(other_instance).meth.__func__ # False (for different instances)
Das obige ist der detaillierte Inhalt vonWarum sind Python-Methoden nicht gleich, auch wenn sie sich auf dieselbe zugrunde liegende Funktion beziehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!