Heim > Backend-Entwicklung > Python-Tutorial > Warum funktioniert das Überschreiben von Instanzen für spezielle Methoden wie „__repr__' in Python nicht?

Warum funktioniert das Überschreiben von Instanzen für spezielle Methoden wie „__repr__' in Python nicht?

Linda Hamilton
Freigeben: 2024-12-06 17:01:11
Original
690 Leute haben es durchsucht

Why Doesn't Instance Overriding Work for Special Methods Like `__repr__` in Python?

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

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

Jetzt können Sie __repr__( überschreiben. ) für eine Instanz ersetzen Sie es einfach durch _repr():

setattr(a, "__repr__", MethodType(_repr, a, a.__class__))
Nach dem Login kopieren

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

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!

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