Heim > Backend-Entwicklung > Python-Tutorial > 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
Freigeben: 2024-10-29 04:59:29
Original
919 Leute haben es durchsucht

 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
Nach dem Login kopieren

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)
Nach dem Login kopieren

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
    Nach dem Login kopieren
  • Methoden in 不同的-Klassen sind immer unterschiedliche Objekte:

    What.meth is Other.meth  # False
    Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage