我有一种实现rmul的方法,以便它可以双向运行吗?
我正在使用mul将R3类的两个向量a和b逐个元素相乘。后来,我希望能够使用2 * a和a * 2之类的运算符将每个元素乘以一个数字。
class R3(object):
def __init__(self,an_array):
self.a = an_array # of length 3
self.s = 3
def __mul__(self,that):
tmp = [0]*self.s
for i in range(self.s):
tmp[i] = self.a[i]*that.a[i]
return self.__class__(tmp)
def __rmul__(self,that):
tmp = [0]*self.s
for i in range(self.s):
tmp[i] = self.a[i]*that
return self.__class__(tmp)
因此,这对于a * b,b * a,2 * a,但对于a * 2而言,效果很好!
最佳答案
您不能在两侧都实现__rmul__
,因为根据定义,__rmul__
用于右乘法。若要更改x * y
的行为,必须查看x.__class__.__mul__
或y.__class__.__rmul__
。a * b
使用R3.__mul__
(确定)b * a
也使用R3.__mul__
(确定)2 * a
首先使用int.__mul__
,然后失败,然后尝试使用R3.__rmul__
(确定)a * 2
使用R3.__mul__
,失败,使用int.__rmul__
,再次失败(不稳定)!
当前编写方式,__mul__
假定that
参数是R3
实例,__rmul__
假定that
参数是标量。
您不能修改int.__rmul__
来更改后一种情况的行为,因为您不能修补那些内置类型。但是,您可以修改您的R3.__mul__
来更改该行为。
您已经实现了__mul__
以仅处理传递到R3
的that
实例。对其进行修复,以便它也可以处理传递到that
的标量。