小能豆

在 Python 中,运算符映射到魔法方法的位置在哪里?

py

我一直在阅读有关 Python 中的魔术方法的文章,并且发现了很多关于覆盖它们以及它们的用途的信息,但是我无法找到语言中特定的运算符和操作映射到这些方法的位置(+查找__add__+=查找__iadd__、从类创建新对象可能会调用__new____init__等)是否有地方可以看到当 Python 解释器(或任何较低级别的机制)遇到加号时会发生什么?


阅读 20

收藏
2024-11-12

共1个答案

小能豆

在 Python 中,魔法方法(也称为“dunder”方法)确实映射到特定的运算符和行为,并且有官方资源记录了这种映射。当 Python 解释器遇到运算符或构造时,它会在内部将它们转换为对相关对象的适当魔法方法的调用。

在哪里可以找到映射

  1. Python 文档 - 数据模型:最好的起点是 Python 的官方文档,特别是数据模型部分。本节详细介绍了 Python 语法和魔法方法之间的关系,描述了解释器如何使用这些方法来实现运算符和其他语言结构。例如:
  2. 加法运算符+映射到__add__
  3. 就地加法+=映射到__iadd__
  4. 比较运算符(<,,,,,,)映射到诸如,,,等方法<=>``>=``==``!=``__lt__``__le__``__gt__
  5. 项目访问(obj[key])映射到__getitem__,并且设置项目映射到__setitem__
  6. 语言参考 - 表达式Python语言参考表达式部分还细分了特定的表达式类型(算术、比较、属性引用等)以及 Python 尝试为每个操作调用的方法
  7. 模块operator模块提供许多魔术方法的功能等效项,文档列出了每个操作的相应魔术方法。例如,等效于。如果您想以编程方式调用这些方法,此模块会很有用operatoroperator.add(a, b)``a.__add__(b)
  8. 源代码:如果您对 Python 解释器本身如何将这些运算符映射到较低级别的方法感兴趣,可以检查 Python 源代码。在 CPython(最常见的 Python 实现)中,这些映射在CPython GitHub存储库object.c中的文件和相关文件中以 C 代码实现。

常见映射示例

这里列出了一些常见的 Python 运算符及其对应的魔法方法,以供快速参考:

操作员 魔法方法
+ __add__
- __sub__
* __mul__
/ __truediv__
// __floordiv__
% __mod__
** __pow__
<< __lshift__
>> __rshift__
& __and__
|
^ __xor__
+= __iadd__
== __eq__
< __lt__
[] __getitem__
in __contains__

数据模型文档有更详尽的列表,并解释了每种方法的目的以及 Python 在实现它们时期望的行为。

2024-11-12