gpt4 book ai didi

python - 覆盖实例上的特殊方法

转载 作者:IT老高 更新时间:2023-10-28 20:39:03 25 4
gpt4 key购买 nike

希望对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"的预期结果?我想知道为什么会这样,是否有办法实现这一点......

相比之下,下面的例子可以工作(也许是因为我们没有试图覆盖一个特殊的方法?):

>>> 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 通常不会在实例上调用特殊方法(名称由 __ 包围的方法),而只会在类上调用。 (虽然这是一个实现细节,但它是标准解释器 CPython 的特性。)所以没有办法直接在实例上覆盖 __repr__() 并使其工作。相反,您需要这样做:

class A(object):
def __repr__(self):
return self._repr()
def _repr(self):
return object.__repr__(self)

现在您可以通过替换 _repr() 来覆盖实例上的 __repr__()

关于python - 覆盖实例上的特殊方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10376604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com