Heim > Backend-Entwicklung > Python-Tutorial > Warum funktioniert das Überschreiben von „__repr__' auf einer Instanz in Python nicht und wie kann dies effektiv erreicht werden?

Warum funktioniert das Überschreiben von „__repr__' auf einer Instanz in Python nicht und wie kann dies effektiv erreicht werden?

Mary-Kate Olsen
Freigeben: 2024-11-28 12:30:11
Original
596 Leute haben es durchsucht

Why Doesn't Overriding `__repr__` on an Instance Work in Python, and How Can It Be Effectively Achieved?

Spezielle Methoden auf einer Instanz überschreiben

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

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

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!

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