Heim  >  Artikel  >  Backend-Entwicklung  >  Warum sind Python-Methoden nicht gleich, auch wenn sie sich auf dieselbe zugrunde liegende Funktion beziehen?

Warum sind Python-Methoden nicht gleich, auch wenn sie sich auf dieselbe zugrunde liegende Funktion beziehen?

Barbara Streisand
Barbara StreisandOriginal
2024-10-29 04:59:29859Durchsuche

 Why are Python Methods Not Equal, Even if They Refer to the Same Underlying Function?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn