从双方实施 __rmul__,python
implement __rmul__ from both sides, python
我有办法实现 rmul 以便它双向工作吗?
我正在使用 mul 将 class 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__
以仅处理传递给 that
的 R3
个实例。修复它以便它也可以处理传递给 that
的标量。
class NumString:
def __init__(self, value):
self.value = str(value)
def __str__(self):
return self.value
def __int__(self):
return int(self.value)
def __float__(self):
return float(self.value)
def __add__(self, other):
if '.' in self.value:
return float(self) + other
return int(self) + other
def __radd__(self, other):
return self + other
def __iadd__(self, other):
self.value = self + other
return self.value
def __mu1__(self, other):
if '.' in self.value:
return float(self) * other
return int(self) * other
def __rmu1__(self, other):
return self * value
我有办法实现 rmul 以便它双向工作吗? 我正在使用 mul 将 class 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__
以仅处理传递给 that
的 R3
个实例。修复它以便它也可以处理传递给 that
的标量。
class NumString:
def __init__(self, value):
self.value = str(value)
def __str__(self):
return self.value
def __int__(self):
return int(self.value)
def __float__(self):
return float(self.value)
def __add__(self, other):
if '.' in self.value:
return float(self) + other
return int(self) + other
def __radd__(self, other):
return self + other
def __iadd__(self, other):
self.value = self + other
return self.value
def __mu1__(self, other):
if '.' in self.value:
return float(self) * other
return int(self) * other
def __rmu1__(self, other):
return self * value