数量乘法实现的疑问
来源:2-5 实现向量的基本运算.
公孙睿Python
2020-02-22
bobo老师,您好!请问在Vector数量乘法中,为什么把__mul__改成__rmul__就可以实现k的位置不同,代码里面好像看不出来?
2回答
-
公孙睿Python
提问者
2020-02-23
老师好!我就是区别不出这两个方法有什么不同?
072020-02-23 -
liuyubobobo
2020-02-23
我不确定我是不是理解了你的问题。
我们不是把 __mul__ 改成了 __rmul__,而是 添加了 __rmul__ 方法。
__mul__ 定义了 self * k 是如何运算的;
__rmul__ 定义了 k * self 是如何运算的。
==========
在 main 函数中,运行 vec * 3 的过程,就会执行 Vector 类的 __mul__ 逻辑。
Vector 的 __mul__ 逻辑是这样的:
def __mul__(self, k): """返回数量乘法的结果向量:self * k""" return Vector([k * e for e in self])
这个逻辑已经很完整了,返回了一个新的 Vector 类的对象。这里,我相信你没有问题。
但是,在 main 函数中,计算 3 * vec 的时候,此时,这个 3 在 vec 的左边,不能执行 __mul__,需要执行 __rmul__,这就是我们写 __rmul__ 的意义。
__rmul__ 的逻辑是这样的:
def __rmul__(self, k): """返回数量乘法的结果向量:k * self""" return self * k
进入 __rmul__ 以后,就一句话,执行 return self * k
此时,为了计算这个 self * k,因为 k 在右边,所以又会调用 __mul__ 的逻辑,进入了这个函数:
def __mul__(self, k): """返回数量乘法的结果向量:self * k""" return Vector([k * e for e in self])
在 __mul__ 这个函数中,再次按照 __mul__ 的定义,创建了一个新的 Vector,返回了回去。
以上是整个执行过程。
==========
补充说明1:
def __rmul__(k, self) return __mul__ 的写法不对,因为语法不对。
补充说明2:
def __rmul__(self, k): """返回数量乘法的结果向量:k * self""" return self * k
这个 __rmul__ 函数本质其实就是在说,k * self 的运算结果,和 self * k 一样。
如果还不能理解,把 __rmul__ 写成这样也是正确的:
def __rmul__(self, k): """返回数量乘法的结果向量:k * self""" return Vector([k * e for e in self])
如果你还不能理解,我也不知道要怎么解释了。。。
继续加油!:)
072020-02-23
相似问题