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!