从双方实施 __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__ 以仅处理传递给 thatR3 个实例。修复它以便它也可以处理传递给 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