Beachten Sie den folgenden Codeausschnitt:
class A(object): pass def __repr__(self): return "A" from types import MethodType a = A() print(a) # <__main__.A object at 0x00AC6990> print(repr(a)) # '<__main__.A object at 0x00AC6990>' setattr(a, "__repr__", MethodType(__repr__, a, a.__class__)) print(a) # <__main__.A object at 0x00AC6990> print(repr(a)) # '<__main__.A object at 0x00AC6990>'
Wie beobachtet, wird die benutzerdefinierte __repr__-Methode nicht aufgerufen die Instanz a. Um dieses Verhalten zu verstehen, ist es wichtig zu beachten, dass:
In CPython (dem Standard-Python-Interpreter) werden spezielle Methoden mit Namen, die von __ umgeben sind, normalerweise nicht für Instanzen, sondern für Klassen aufgerufen. Daher führt der Versuch, __repr__ direkt auf einer Instanz zu überschreiben, nicht zum erwarteten Ergebnis.
Um diese Einschränkung zu umgehen, kann man die folgende Strategie nutzen:
class A(object): def __repr__(self): return self._repr() def _repr(self): return object.__repr__(self)
Hier __repr__ ruft eine Hilfsmethode _repr auf, die dann die Standardimplementierung __repr__ für die Objektklasse aufruft. Durch das Überschreiben von _repr können wir __repr__ für eine Instanz effektiv überschreiben.
Das obige ist der detaillierte Inhalt vonWarum funktioniert das Überschreiben von „__repr__' auf einer Instanz in Python nicht und wie kann dies effektiv erreicht werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!