重写实例上的特殊方法:探索
想象一种情况,您有一个类的实例,并且希望修改它特殊方法,例如 __repr__()。尝试重写这些方法时,您可能会遇到意外行为。
为了说明这一点,请考虑以下代码:
class A(object): pass def __repr__(self): return "A" from types import MethodType a = A()
调用 repr(a) 时,您期望获得“A ,”鉴于 repr 已被覆盖。然而,结果并不如预期。
这种差异源于Python调用特殊方法的方式。通常,Python 仅对类本身执行特殊方法,而不对其实例执行特殊方法。因此,直接在实例上覆盖 repr 是无效的。
要克服此限制,请考虑以下方法:
class A(object): def __repr__(self): return self._repr() def _repr(self): return object.__repr__(self)
在此修改后的代码中,实例上的 repr 可以通过替换来覆盖_repr().
将此行为与以下代码片段进行对比,举例说明了重写特殊方法和常规方法之间的区别:
class A(object): def foo(self): return "foo" def bar(self): return "bar" a = A() setattr(a, "foo", MethodType(bar, a, a.__class__))
在本例中,foo实例上的特殊方法已成功重写。然而,值得注意的是,这种能力是常规方法所独有的。
以上是为什么我不能直接在 Python 实例上重写特殊方法?的详细内容。更多信息请关注PHP中文网其他相关文章!