我有一种实现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__以仅处理传递到R3that实例。对其进行修复,以便它也可以处理传递到that的标量。

09-27 13:42
查看更多