Python:启用自定义对象与标准类型相乘/添加

eni*_*gma 2 python

我知道可以创建一个object.__mul__(self, other)方法来启用两个对象的自定义乘法.但是,如python文档中所述,

评估表达式x + y,调用x具有__add__()方法的类的实例x.__add__(y).

是否有可能以相反的顺序允许对象的自定义乘法/加法,即y + x,x我们可以控制的实例在哪里,并且y是标准类型,例如浮点数?

aba*_*ert 6

是的,这是可能的.

事实上,它只是在您正在查看的相同文档中解释了半页.你只需定义一个__rmul__(self, other)方法.

正如文档所说:

这些方法称为执行二进制算术运算(+,-,*,/,%,divmod(),pow(),**,<<,>>,&,^,|以反映(换)操作数).仅当左操作数不支持相应操作且操作数具有不同类型时才调用这些函数.例如,要计算表达式x - y,其中y是具有__rsub__()方法的类的实例,y.__rsub__(x)如果x.__sub__(y)返回则调用NotImplemented.

所以:

>>> class Thingy(object):
...     def __mul__(self, other):
...         print('mul', other)
...     def __rmul__(self, other):
...         print('rmul', other)
>>> thingy = Thingy()
>>> thingy * 3
mul 3
>>> 3 * thingy
rmul 3
Run Code Online (Sandbox Code Playgroud)

有关子类的说明,请参阅相关说明; 对于内置类型,通常不是.

另请注意,没有__rlt__,__req__等等,但适用相同的规则; 它只是反射是__gt__,__eq__你已经定义的方法等等.