我知道可以创建一个object.__mul__(self, other)
方法来启用两个对象的自定义乘法。但是,如python文档中所述,
评估表达式
x + y
,其中x
是类的实例 如果使用__add__()
方法,则会调用x.__add__(y)
。
是否有可能以相反的顺序允许自定义乘法/添加对象,即y + x
,其中x
是我们可以控制的实例,{{1} }是标准类型,例如浮动?
答案 0 :(得分: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
有关子类的相关信息,请参阅说明;对于内置类型,通常它不是。
另请注意,没有__rlt__
,__req__
等,但适用相同的规则;只是反射是您已定义的__gt__
,__eq__
等方法。