python - 动态重载运算符

python - Overloading operators on the fly

我想知道,是否有办法在运行时重载 Python 中的运算符。例如:

class A:
   pass
a = A()
a.__str__ = lambda self: "noice"
print(str(a))

所需的输出是 "noice",但给定的代码使用 objectstr 函数的实现,产生了一些类似的东西:<__main__.A object at 0x000001CAB2051490>

为什么代码不使用我重载的函数重载实现?

Python 使用的版本是 3.9.2.

当您调用 str(a) 时,它解析为 a.__class__.__str__(a) 的等价物,而不是 a.__str__()

>>> A.__str__ = lambda self: "noice"
>>> str(a)
'noice'

您必须将该函数分配给 class,而不是 class 的实例。

>>> class A:
...     pass
...
>>> a = A()
>>> a.__str__ = lambda x: 'hi'
>>> print(a)
<__main__.A object at 0x000000A4D16C1D30>
>>> A.__str__ = lambda x: 'hi'
>>> print(a)
hi