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
Linda HamiltonOriginal
2024-12-06 17:01:11681Durchsuche

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

Ü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!

Stellungnahme:
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