python - 动态重载运算符
python - Overloading operators on the fly
我想知道,是否有办法在运行时重载 Python 中的运算符。例如:
class A:
pass
a = A()
a.__str__ = lambda self: "noice"
print(str(a))
所需的输出是 "noice"
,但给定的代码使用 object
对 str
函数的实现,产生了一些类似的东西:<__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
我想知道,是否有办法在运行时重载 Python 中的运算符。例如:
class A:
pass
a = A()
a.__str__ = lambda self: "noice"
print(str(a))
所需的输出是 "noice"
,但给定的代码使用 object
对 str
函数的实现,产生了一些类似的东西:<__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