在 Python 编程中,我们经常会遇到各种“魔术方法”(Magic Methods),它们以双下划线开头和结尾(如 __init__、__str__ 等),用于重载操作符或定义对象行为。今天我们要深入探讨的是 __matmul__ 方法——它让我们的自定义类支持使用 @ 运算符进行“矩阵乘法”。

__matmul__ 是 Python 3.5 引入的一个魔术方法,专门用于实现 @ 运算符的行为。这个运算符最初是为了支持矩阵乘法而设计的,尤其在科学计算(如 NumPy)中非常常见。
例如,在 NumPy 中:
import numpy as npa = np.array([[1, 2], [3, 4]])b = np.array([[5, 6], [7, 8]])result = a @ b # 等价于 np.matmul(a, b)print(result)这段代码会输出矩阵乘法的结果。但如果你自己写了一个表示矩阵的类,想让它也支持 @ 运算符,那就需要实现 __matmul__ 方法。
假设我们创建一个简单的 Matrix 类,并希望用 @ 来做矩阵乘法。下面是一个完整示例:
class Matrix: def __init__(self, data): self.data = data self.rows = len(data) self.cols = len(data[0]) if self.rows > 0 else 0 def __matmul__(self, other): if not isinstance(other, Matrix): return NotImplemented if self.cols != other.rows: raise ValueError("无法相乘:第一个矩阵的列数必须等于第二个矩阵的行数") # 初始化结果矩阵 result = [[0 for _ in range(other.cols)] for _ in range(self.rows)] # 执行矩阵乘法 for i in range(self.rows): for j in range(other.cols): for k in range(self.cols): result[i][j] += self.data[i][k] * other.data[k][j] return Matrix(result) def __repr__(self): return f"Matrix({self.data})"# 使用示例A = Matrix([[1, 2], [3, 4]])B = Matrix([[5, 6], [7, 8]])C = A @ Bprint(C) # 输出: Matrix([[19, 22], [43, 50]])在这个例子中,我们实现了 __matmul__ 方法,使得两个 Matrix 对象可以通过 @ 进行矩阵乘法运算。这就是 Python 魔术方法 的强大之处!
在 __matmul__ 出现之前,Python 没有专门用于矩阵乘法的运算符。开发者通常使用 *,但这容易与元素级乘法混淆(尤其是在 NumPy 中)。为了清晰区分,PEP 465 提案引入了 @ 运算符和对应的 __matmul__ 方法。
如今,@ 已成为科学计算、机器学习等领域中表示矩阵乘法的标准符号。掌握 __matmul__ 不仅能让你写出更专业的代码,还能更好地理解像 TensorFlow、PyTorch 这样的框架内部机制。
除了 __matmul__,你还可以实现:
__rmatmul__:用于反向调用(当左操作数不支持 @ 时)__imatmul__:用于就地操作(如 a @= b)例如:
def __rmatmul__(self, other): # 当 other @ self 被调用且 other 没有 __matmul__ 时触发 return self.__matmul__(other) # 简化处理,实际需根据类型判断def __imatmul__(self, other): # 实现 a @= b result = self @ other self.data = result.data return self__matmul__ 是 Python 中一个专为矩阵乘法设计的魔术方法,通过实现它,你可以让你的自定义类支持 @ 运算符。这不仅提升了代码的可读性,也符合现代数值计算的惯例。
无论你是刚接触 Python __matmul__ 的新手,还是想深入了解 自定义类运算符 的开发者,掌握这个方法都将为你打开一扇通往更专业 Python 编程的大门。同时,这也是理解 矩阵乘法 在 Python 中如何优雅表达的关键。
记住:好的代码不仅要能运行,还要清晰表达意图。而 @ 和 __matmul__ 正是为此而生!
本文由主机测评网于2025-12-03发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025122203.html