Home >Backend Development >Python Tutorial >Why Doesn\'t Instance Overriding Work for Special Methods Like `__repr__` in Python?
Understanding Instance Overrides for Special Methods
Consider the code below:
class A(object): pass def __repr__(self): return "A" from types import MethodType a = A() a
Surprisingly, repr(a) does not yield the intended result "A". Why is this, and can we rectify this behavior?
In Python, special methods (those with names surrounded by "__") are typically invoked on the class, rather than on the instance. This is an implementation detail of CPython, the standard interpreter. Therefore, there is no direct way to override __repr__() on an instance and expect it to work.
However, there is an indirect solution:
class A(object): def __repr__(self): return self._repr() def _repr(self): return object.__repr__(self)
Now, to override __repr__() for an instance, simply replace it with _repr():
setattr(a, "__repr__", MethodType(_repr, a, a.__class__))
This approach proves effective because _repr() calls the original __repr__() method, which is implemented on the class level.
In contrast, consider this example, where we attempt to override a non-special method:
class A(object): def foo(self): return "foo" def bar(self): return "bar" a = A() setattr(a, "foo", MethodType(bar, a, a.__class__))
In this case, the override works as expected, as foo() is a non-special method and is therefore called directly on the instance.
The above is the detailed content of Why Doesn\'t Instance Overriding Work for Special Methods Like `__repr__` in Python?. For more information, please follow other related articles on the PHP Chinese website!