在 Python 中,__rmatmul__ 是一个特殊的“魔术方法”(Magic Method),用于实现反向矩阵乘法操作。如果你正在学习 Python 魔术方法 或希望自定义类以支持 @ 运算符(即矩阵乘法),那么理解 __rmatmul__ 至关重要。

从 Python 3.5 开始,引入了 @ 运算符用于表示矩阵乘法。当你写 a @ b 时,Python 会调用 a.__matmul__(b)。但如果 a 没有实现 __matmul__,而 b 实现了 __rmatmul__,Python 就会尝试调用 b.__rmatmul__(a)。
这里的 “r” 表示 “right”(右),即当左操作数不支持该操作时,右操作数的反向方法会被调用。
考虑以下场景:你有一个自定义的矩阵类 MyMatrix,并希望它能与 NumPy 数组或其他类型进行 @ 运算。如果另一个对象(比如整数或列表)不支持 __matmul__,但你的 MyMatrix 支持 __rmatmul__,那么表达式依然可以正常工作。
下面是一个简单的自定义矩阵类,它同时实现了 __matmul__ 和 __rmatmul__:
class MyMatrix: def __init__(self, data): self.data = data # 假设 data 是一个二维列表 def __matmul__(self, other): # 实现标准矩阵乘法 if isinstance(other, MyMatrix): return self._multiply(self.data, other.data) elif hasattr(other, '__matmul__'): # 如果 other 支持 @,交给它处理 return NotImplemented else: raise TypeError("不支持的矩阵乘法操作") def __rmatmul__(self, other): # 当 other @ self 且 other 不支持 __matmul__ 时被调用 print(f"调用了 __rmatmul__!other = {other}") if isinstance(other, list): # 假设 other 是一个行向量 temp_matrix = MyMatrix([other]) result = temp_matrix @ self return result.data[0] # 返回一维结果 else: return NotImplemented def _multiply(self, a, b): # 简单的矩阵乘法实现(仅用于演示) rows_a, cols_a = len(a), len(a[0]) rows_b, cols_b = len(b), len(b[0]) if cols_a != rows_b: raise ValueError("矩阵维度不匹配") result = [[sum(a[i][k] * b[k][j] for k in range(cols_a)) for j in range(cols_b)] for i in range(rows_a)] return MyMatrix(result) def __repr__(self): return f"MyMatrix({self.data})"现在我们来测试这个类:
# 创建一个 2x2 矩阵m = MyMatrix([[1, 2], [3, 4]])# 正常矩阵乘法result1 = m @ mprint(result1) # 输出: MyMatrix([[7, 10], [15, 22]])# 使用列表作为左操作数(触发 __rmatmul__)vec = [1, 0]result2 = vec @ mprint(result2) # 输出: [1, 2],并打印 "调用了 __rmatmul__!other = [1, 0]"在这个例子中,[1, 0] @ m 触发了 m.__rmatmul__([1, 0]),因为 Python 列表没有定义 __matmul__ 方法。
__matmul__ 返回 NotImplemented,Python 会自动尝试调用右操作数的 __rmatmul__。__rmatmul__ 应只在确实需要处理反向操作时实现,避免逻辑混乱。通过本文,你应该已经掌握了 Python __rmatmul__ 方法 的基本原理和使用场景。它是实现灵活、可组合的自定义矩阵运算的关键组成部分。无论你是初学者还是进阶开发者,理解这类Python 魔术方法都能让你写出更优雅、更符合直觉的代码。
记住:当左操作数无法处理 @ 运算时,__rmatmul__ 就是你的“后备方案”!
本文由主机测评网于2025-12-12发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126779.html