如何覆盖python中的__mul__函数

时间:2018-06-29 13:27:39

标签: python overwrite operation

我用python这样写一个类

class Vector(object):
def __init__(self, coordinates):
    try:
        if not coordinates:
            raise ValueError
        self.coordinates = tuple(coordinates)
        self.dimension = len(coordinates)

    except ValueError:
        raise ValueError('The coordinates must be nonempty')

    except TypeError:
        raise TypeError('The coordinates must be an iterable')

def __add__(self,v):
    v1 = np.array(self.coordinates)
    v2 = np.array(v.coordinates)
    result = v1 + v2
    return result.tolist()

def __sub__(self, other):
    v1 = np.array(self.coordinates)
    v2 = np.array(other.coordinates)
    result = v1 - v2
    return result.tolist()

def __mul__(self, other):
    return other * np.array(self.coordinates)

def multiply(self,other):
    v = Decimal(str(other)) * np.array(self.coordinates)
    return v

def __str__(self):
    return 'Vector: {}'.format(self.coordinates)


def __eq__(self, v):
    return self.coordinates == v.coordinates

我想覆盖操作*,所以我可以实现以下功能:

3*Vector([1,2,3])=Vector([3,6,9])

所以我尝试了这样的代码:

    def __mul__(self, other):
    return other * np.array(self.coordinates)

但是,我很失望地注意到此功能仅在以下情况下可用

Vector([1,2,3])*3

如果我写过:

3*Vector([1,2,3])

它说:

  

TypeError:*:“ int”和“ Vector”不支持的操作数类型

如何获得在3*Vector([1,2,3])Vector([1,2,3])*3上都可以使用的功能?

非常感谢您。

2 个答案:

答案 0 :(得分:0)

这正是设计rmul的原因。

class Vector(object):
    # ...
    def __rmul__(self, other):
       return self.__mul__(other)

答案 1 :(得分:0)

Vector([1,2,3])*3之所以有效,是因为Vector()*3的意思是“使用__mul__()自变量调用我的矢量对象的int函数”。

但是3*Vector([1,2,3])不起作用,因为它试图使用int参数调用Vector对象的乘法函数:int不知道您的{ {1}}类,因此会引发错误。

您需要在Vector上定义一个__rmul__()函数来解决此问题。