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__ 方法,实现了右乘操作,最终得到了一个新的向量对象。

 

posted @ 2024-02-24 20:33  AlphaGeek  阅读(9)  评论(0)    收藏  举报