python - 在python中重载任意运算符
问题描述
是否可以在 Python 中重载任意运算符?还是仅限于与此处列出的相关魔术方法的运算符列表:https ://www.python-course.eu/python3_magic_methods.php ?
我之所以问是因为我注意到 Numpy 使用 @ 运算符来执行矩阵乘法,例如 C=A@B 其中 A,B 是 Numpy 数组,我想知道他们是如何做到的。
编辑:@ 运算符不在我链接到的列表中。
有人可以指出我完成此操作的 Numpy 源吗?
解决方案
在 Python 中,您不能创建新的运算符,不。通过定义这些“魔术”函数,您可以影响使用标准运算符对您自己定义的对象进行操作时发生的情况。
但是,您链接到的列表并不完整。在 Python 3.5 中,他们为运算符添加了特殊方法@
。这是 Python 运算符模块文档中相当简洁的列表,这里是有关运算符重载的文档。
operator.matmul(a, b)
operator.__matmul__(a, b)
返回
a @ b
。3.5 版中的新功能。
我没有亲自见过那个接线员,所以我做了更多的研究。它专门用于矩阵乘法。但是,我可以将它用于其他目的,尽管出于风格问题我会反对这样做:
In [1]: class RichGuyEmailAddress(str):
...: def __matmul__(self, domain_name):
...: return f'{self}@{domain_name}'
...:
In [2]: my_email = RichGuyEmailAddress('billg') @ 'microsoft.com'
In [3]: print(my_email)
billg@microsoft.com
所以,不,你不能重载任何随机字符,但你可以重载@
运算符。
推荐阅读
- python - 如何在 Python gRPC 处理程序中访问方法名称
- python - 单击按钮时无法加载照片
- java - 无法将数据绑定到 Spring mvc 中的 ModelAttribute 列表属性
- javascript - 如何在javascript中调用多个平面?
- python - 当 DatetimeIndex 是一年中的最后一天时,Pandas DataFrame 重新采样为月份
- python - Python文件打开然后立即关闭
- ios - 使用文本输入时 Flutter 仅显示 0-9 键盘而不是扩展数字键盘(即所有 ascii 字符都应该可用)
- django - Django 从 ListView 创建模型
- javascript - 如何在汽车的拐角处附加一个旋转圆圈?
- c# - ASP.NET Core MVC 绑定包含 2 个域模型的 Viewmodel