用户定义的__mul__方法不可交换

sma*_*ane 23 python built-in extend

我编写了一个用Python表示向量的类(作为练习),我在扩展内置运算符方面遇到了问题.

__mul__为vector类定义了一个方法.问题是在表达式中x * y,解释器调用__mul__x 的方法,而不是y.

所以vector(1, 2, 3) * 2返回一个矢量<2,4,6>就像它应该的那样; 但是2 * vector(1, 2, 3)会创建一个TypeError,因为内置的int类不支持我的用户定义向量的乘法.

我可以通过简单地编写一个新的乘法函数来解决这个问题

def multiply(a, b):
    try:
        return a * b
    except TypeError:
        return b * a
Run Code Online (Sandbox Code Playgroud)

但这需要重新定义我想用于用户定义的类的每个函数.

有没有办法让内置函数正确处理?

pil*_*her 29

如果你想要不同类型的交换性,你需要实现__rmul__().如果实现的话,它会像所有__r*__()特殊方法一样被调用,否则操作会引发操作TypeError.请注意参数是交换的:

class Foo(object):
    def __mul_(self, other):
        ''' multiply self with other, e.g. Foo() * 7 '''
    def __rmul__(self, other):
        ''' multiply other with self, e.g. 7 * Foo() '''
Run Code Online (Sandbox Code Playgroud)

  • @pst,Python首先调用`__mul__`,但如果它不存在或者它返回`NotImplemented`那么Python调用另一个对象的`__rmul__`.(注意,如果`__mul__`引发一个execption,`__rmul__`被__not__调用. (4认同)
  • 它试图使用左侧的`__mul__`,如果找不到,那么它会查找右侧的`__rmul__`. (2认同)