In Python, a common goal for developers is to override special methods on an instance. However, this is not typically possible as special methods are typically only called on the class itself.
Problem:
To illustrate this concept, consider the following code snippet:
class A(object): pass def __repr__(self): return "A" from types import MethodType a = A() a repr(a) setattr(a, "__repr__", MethodType(__repr__, a, a.__class__)) a repr(a)
As seen above, overriding __repr__ directly on the instance doesn't yield the expected result. repr(a) returns the default class representation, not the overridden method's return value.
Solution:
To achieve overriding special methods on an instance, you can employ an indirect approach. Define the special method as a wrapper that calls an internal, overridden method:
class A(object): def __repr__(self): return self._repr() def _repr(self): return object.__repr__(self)
Now, you can override __repr__ on an instance by overwriting _repr(). For example:
a = A() setattr(a, "_repr", lambda self: "Overridden") repr(a)
This updated code will output the overridden string representation.
The above is the detailed content of How Can I Override Special Methods on a Python Instance?. For more information, please follow other related articles on the PHP Chinese website!