我希望有人能够回答这个对Python有深刻理解的问题
考虑以下代码:
>>> class A(object): ... pass ... >>> def __repr__(self): ... return "A" ... >>> from types import MethodType >>> a = A() >>> a <__main__.A object at 0x00AC6990> >>> repr(a) '<__main__.A object at 0x00AC6990>' >>> setattr(a, "__repr__", MethodType(__repr__, a, a.__class__)) >>> a <__main__.A object at 0x00AC6990> >>> repr(a) '<__main__.A object at 0x00AC6990>' >>>
注意repr(a)如何不会产生“ A”的预期结果?我想知道为什么会这样,是否有办法实现这一目标…
repr(a
“ A”
相比之下,下面的示例仍然有效(也许是因为我们不打算重写特殊方法吗?):
>>> class A(object): ... def foo(self): ... return "foo" ... >>> def bar(self): ... return "bar" ... >>> from types import MethodType >>> a = A() >>> a.foo() 'foo' >>> setattr(a, "foo", MethodType(bar, a, a.__class__)) >>> a.foo() 'bar' >>>
Python不会调用特殊方法,那些__在实例上带有名称包围的特殊方法,而仅在类上,显然可以提高性能。因此,无法__repr__()直接在实例上进行覆盖并使其起作用。相反,你需要执行以下操作:
Python
__repr__()
class A(object): def __repr__(self): return self._repr() def _repr(self): return object.__repr__(self)
现在,你可以__repr__()通过替换替代实例_repr()
_repr()