Heim  >  Artikel  >  Backend-Entwicklung  >  Warum kann „is“ Methoden in Python nicht vergleichen, funktioniert aber für Funktionen?

Warum kann „is“ Methoden in Python nicht vergleichen, funktioniert aber für Funktionen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-02 18:35:03499Durchsuche

  Why Does `is` Fail to Compare Methods in Python, But Works for Functions?

Methodengleichheit in Python: Das Rätsel der Referenzungleichheit lösen

In Python weisen Methoden und Funktionen einen merkwürdigen Unterschied auf: Während Funktionen Referenzgleichheit aufweisen , Methoden nicht. Dies kann zu unerwarteten Fehlern führen, insbesondere wenn man sich zum Vergleichen von Methoden auf den Operator is verlässt.

Warum sich Referenzgleichheit Methoden entzieht

Im Gegensatz zu Funktionen, bei denen es sich um statische Entitäten handelt, ist Methode Objekte werden bei jedem Zugriff dynamisch erstellt. Dies liegt daran, dass Methoden als Deskriptoren fungieren und ein neues Methodenobjekt zurückgeben, wenn ihre .__get__-Methode aufgerufen wird. Zum Beispiel im bereitgestellten Beispiel:

class What:
    def meth(self):
        pass

Die Zuweisung What.meth gibt ein Funktionsobjekt zurück, das sich von dem gebundenen Methodenobjekt unterscheidet, das später beim Aufruf von inst.meth erstellt wird. Dies erklärt, warum What.meth is What.meth als False ausgewertet wird.

Ist Gleichheit in Python 3.8

In Python-Versionen 3.8 und höher ist ein alternativer Ansatz verfügbar: Verwenden von == für Gleichheitstests. Zwei Methoden gelten als gleich, wenn ihre Attribute .__self__ und .__func__ identische Objekte sind, was darauf hinweist, dass sie dieselbe Funktion umschließen und an dieselbe Instanz gebunden sind.

Für Funktionen __und Ungebundene Methoden

Unabhängig von der Python-Version können Funktionen und ungebundene Methoden (in Python 2) mit dem is-Operator verglichen werden, da sie beide dieselbe zugrunde liegende Funktionsreferenz darstellen.

Test auf zugrunde liegende Funktion

Wenn überprüft werden soll, ob zwei Methoden dieselbe zugrunde liegende Funktion darstellen, kann das Attribut .__func__ verglichen werden:

if What().meth.__func__ == What().meth.__func__:
    print("Methods represent the same function")

Dieser Ansatz bietet konsistente und zuverlässige Gleichheitsprüfungen für Methoden und Funktionen, unabhängig von ihrem Bindungsstatus oder ihrer Python-Version.

Das obige ist der detaillierte Inhalt vonWarum kann „is“ Methoden in Python nicht vergleichen, funktioniert aber für Funktionen?. 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