从双方实现__rmul__,python

时间:2015-06-12 03:40:43

标签: python class operators

我有办法实现 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)      

所以这适用于* b,b * a,2 * a,但不是* 2!

2 个答案:

答案 0 :(得分:3)

您无法为双方实施__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的{​​{1}}个实例。修复它以便它可以处理传递到that的标量。

答案 1 :(得分:0)

<command id="..." name="Undo"></command>