Heim >Backend-Entwicklung >Python-Tutorial >Warum funktioniert das Überschreiben von Instanzen für spezielle Methoden wie „__repr__' in Python nicht?
Instanzüberschreibungen für spezielle Methoden verstehen
Bedenken Sie den folgenden Code:
class A(object): pass def __repr__(self): return "A" from types import MethodType a = A() a
Überraschenderweise repr(a) liefert nicht das gewünschte Ergebnis „A“. Warum ist das so und können wir dieses Verhalten beheben?
In Python werden spezielle Methoden (solche mit Namen, die von „__“ umgeben sind) normalerweise für die Klasse und nicht für die Instanz aufgerufen. Dies ist ein Implementierungsdetail von CPython, dem Standardinterpreter. Daher gibt es keine direkte Möglichkeit, __repr__() auf einer Instanz zu überschreiben und zu erwarten, dass es funktioniert.
Es gibt jedoch eine indirekte Lösung:
class A(object): def __repr__(self): return self._repr() def _repr(self): return object.__repr__(self)
Jetzt können Sie __repr__( überschreiben. ) für eine Instanz ersetzen Sie es einfach durch _repr():
setattr(a, "__repr__", MethodType(_repr, a, a.__class__))
Dieser Ansatz erweist sich als effektiv, da _repr() die aufruft ursprüngliche __repr__()-Methode, die auf Klassenebene implementiert ist.
Betrachten Sie im Gegensatz dazu dieses Beispiel, in dem wir versuchen, eine nicht spezielle Methode zu überschreiben:
class A(object): def foo(self): return "foo" def bar(self): return "bar" a = A() setattr(a, "foo", MethodType(bar, a, a.__class__))
In diesem Fall , funktioniert die Überschreibung wie erwartet, da foo() eine nicht spezielle Methode ist und daher direkt auf der Instanz aufgerufen wird.
Das obige ist der detaillierte Inhalt vonWarum funktioniert das Überschreiben von Instanzen für spezielle Methoden wie „__repr__' in Python nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!