User defined __mul__ method is not commutative

一世执手 提交于 2020-07-31 17:48:45

问题


I wrote a class to represent vectors in Python (as an exercise) and I'm having problems with extending the built-in operators.

I defined a __mul__ method for the vector class. The problem is that in the expression x * y the interpreter calls the __mul__ method of x, not y.

So vector(1, 2, 3) * 2 returns a vector <2, 4, 6> just like it should; but 2 * vector(1, 2, 3) creates a TypeError because the built-in int class does not support multiplication by my user-defined vectors.

I could solve this problem by simply writing a new multiplication function

def multiply(a, b):
    try:
        return a * b
    except TypeError:
        return b * a

but this would require redefining every function that I want to use with my user-defined classes.

Is there a way to make the built-in function handle this correctly?


回答1:


If you want commutativity for different types you need to implement __rmul__(). If implemented, it is called, like all __r*__() special methods, if the operation would otherwise raise a TypeError. Beware that the arguments are swapped:

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() '''



回答2:


I believe you are looking for __rmul__



来源:https://stackoverflow.com/questions/7129441/user-defined-mul-method-is-not-commutative

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!