29

我写了一个类来表示 Python 中的向量(作为练习),我在扩展内置运算符时遇到了问题。

我为向量类定义了一个__mul__方法。问题是在表达式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

但这需要重新定义我想与用户定义的类一起使用的每个函数。

有没有办法让内置函数正确处理这个问题?

4

2 回答 2

36

如果你想要不同类型的交换性,你需要实现__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() '''
于 2011-08-20T03:48:20.533 回答
3

我相信你正在寻找__rmul__

于 2011-08-20T03:49:09.533 回答