Fluent Python2 【Chapter16_QA】
1. 以下代码的__rmul__又如何理解这个所谓的委托呢?清举例说明
class Vector: typecode = 'd' def __init__(self, components): self._components = array(self.typecode, components) def __mul__(self, scalar): try: factor = float(scalar) except TypeError: return NotImplemented return Vector(n * factor for n in self) def __rmul__(self, scalar): # 怎么理解__rmul__委托__mul__ ? return self * scalar
在这个例子中,__rmul__ 方法实际上是将右乘操作委托给了__mul__ 方法。这意味着当一个对象被右乘一个标量时,如果对象本身没有实现__rmul__ 方法,Python 会尝试使用乘法运算符的右操作数的__rmul__ 方法,并将左操作数作为参数传递给它,从而委托给__mul__ 方法来完成乘法运算。
让我们通过一个例子来说明:
v = Vector([1, 2, 3])
result = 2 * v
让我们逐步分解这个例子,说明每一步是如何调用的,最终得出结果。
step1. 创建向量对象:
v = Vector([1, 2, 3])
step2. 右乘操作:
这一步创建了一个向量对象 v,其内部包含元素 [1, 2, 3]。
result = 2 * v
在这一步,我们试图执行右乘操作,即整数2乘以向量 v。因为整数2没有实现 __mul__ 方法,Python 尝试调用向量 v 的 __rmul__ 方法,并将2作为参数传递给它。
step3. 调用 __rmul__ 方法:
result = v.__rmul__(2)
Python 内部实际执行的是这个语句,调用了向量对象 v 的 __rmul__ 方法,并将2作为参数传递给它。
step4. __rmul__ 方法委托给 __mul__ 方法:
result = v.__mul__(2)
在 __rmul__ 方法内部,实际上是调用了向量对象 v 的 __mul__ 方法,并将2作为参数传递给它。因此,最终执行的是乘法操作,返回了一个新的向量对象。
总结:通过调用 __rmul__ 方法委托给 __mul__ 方法,实现了右乘操作,最终得到了一个新的向量对象。

浙公网安备 33010602011771号