您还需要实施__rmul__
。当初始调用int.__mul__(7, v)
失败,Python 接下来会尝试type(v).__rmul__(v, 7)
.
def __rmul__(self, lhs):
return self * lhs # Effectively, turn 7 * v into v * 7
正如 Rawing 指出的,你可以简单地写__rmul__ = __mul__
对于这个定义。__rmul__
存在是为了允许非交换乘法,其中简单地遵循__mul__
操作数颠倒是不够的。
例如,如果你正在写一个Matrix
类并希望支持嵌套列表的乘法,例如,
m = Matrix(...) # Some 2 x 2 matrix
n = [[1, 2], [3,4]]
p = n * m
在这里,list
类不知道如何将列表乘以Matrix
实例,所以当list.__mul__(n, m)
失败,Python 接下来会尝试Matrix.__rmul__(m, n)
。然而,n * m
and m * n
一般来说是两个不同的结果,所以Matrix.__rmul__(m, n) != Matrix.__mul__(m, n)
; __rmul__
必须做一些额外的工作才能生成正确的答案。