我用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
上都可以使用的功能?
非常感谢您。
答案 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__()
函数来解决此问题。