NumPy是如何添加@运算符的?能否为Python 3自定义新运算符?
问题解答
NumPy中@运算符的实现方式
@是Python官方引入的矩阵乘法专用运算符,NumPy对它的支持是通过实现三个特殊方法来完成的:
__matmul__(self, other):处理self @ other的正向运算__rmatmul__(self, other):当左操作数不支持@时,兜底处理other @ self的反向运算__imatmul__(self, other):处理self @= other的原地矩阵乘法
举个极简的自定义类示例,你就能明白这个逻辑:
class SimpleMatrix: def __init__(self, values): self.values = values def __matmul__(self, other): # 简化的二维矩阵乘法实现 rows_self = len(self.values) cols_other = len(other.values[0]) result = [[0]*cols_other for _ in range(rows_self)] for i in range(rows_self): for j in range(cols_other): result[i][j] = sum(self.values[i][k] * other.values[k][j] for k in range(len(other.values))) return SimpleMatrix(result) # 测试代码 m1 = SimpleMatrix([[1, 2], [3, 4]]) m2 = SimpleMatrix([[5, 6], [7, 8]]) print((m1 @ m2).values) # 输出 [[19, 22], [43, 50]]
NumPy的ndarray类就是基于这套机制,在底层用C实现了高效的矩阵乘法逻辑,所以运算速度远高于纯Python实现。
Python 3能否自定义新运算符
Python 3不允许直接新增全新的运算符——所有运算符都是Python语法规范里硬编码的,比如+、*、@这些,你没法自己加一个比如$或者&%这类不在规范里的新运算符。
不过你可以重载现有运算符的行为,比如通过__add__()修改+的作用,或者像上面那样用__matmul__()实现@的逻辑,但这只是修改已有运算符的功能,不是创造新的。
如果确实需要类似“新运算符”的功能,通常的替代方案是定义普通函数或方法,比如用matrix_mult(a, b)来模拟,或者用特殊命名的方法调用,但这和真正的运算符在语法简洁性上没法比。
内容的提问来源于stack exchange,提问作者Quinten C
相关产品推荐
相关产品推荐

