特殊方法速查
这两张表是第 1 章的附录。原文里它们夹在正文中间,翻起来不方便,这里单独拎出来当查阅用。 表格内容照抄自原书表 1-1 和表 1-2,没有改动。
《Python 语言参考》的 “Data Model” 一章列了 80 多个特殊方法名,其中一半以上实现算术、位运算和比较运算符。作为概览,见下面两张表。
表 1-1 列出特殊方法名,不含实现中缀运算符或 abs 这类核心数学函数的方法。这些方法大部分会在本书中陆续讲到,包括最新加入的:异步特殊方法如 __anext__(Python 3.5 加入),以及类定制钩子 __init_subclass__(Python 3.6 加入)。
表 1-1 特殊方法名(不含运算符)
| 类别 | 方法名 |
|---|---|
| 字符串/字节表示 | __repr__ __str__ __format__ __bytes__ __fspath__ |
| 转成数字 | __bool__ __complex__ __int__ __float__ __hash__ __index__ |
| 模拟集合 | __len__ __getitem__ __setitem__ __delitem__ __contains__ |
| 迭代 | __iter__ __aiter__ __next__ __anext__ __reversed__ |
| 可调用对象或协程执行 | __call__ __await__ |
| 上下文管理 | __enter__ __exit__ __aexit__ __aenter__ |
| 实例创建与销毁 | __new__ __init__ __del__ |
| 属性管理 | __getattr__ __getattribute__ __setattr__ __delattr__ __dir__ |
| 属性描述符 | __get__ __set__ __delete__ __set_name__ |
| 抽象基类 | __instancecheck__ __subclasscheck__ |
| 类元编程 | __prepare__ __init_subclass__ __class_getitem__ __mro_entries__ |
中缀运算符和数值运算符由表 1-2 列出的特殊方法支持。这里最新的名字是 __matmul__、__rmatmul__、__imatmul__,Python 3.5 为支持用 @ 作矩阵乘法中缀运算符而加入,第 16 章会看到。
表 1-2 运算符对应的特殊方法名与符号
| 运算符类别 | 符号 | 方法名 |
|---|---|---|
| 一元数值 | - + abs() |
__neg__ __pos__ __abs__ |
| 富比较 | < <= == != > >= |
__lt__ __le__ __eq__ __ne__ __gt__ __ge__ |
| 算术 | + - * / // % @ divmod() round() ** pow() |
__add__ __sub__ __mul__ __truediv__ __floordiv__ __mod__ __matmul__ __divmod__ __round__ __pow__ |
| 反向算术(操作数对调的算术运算符) | __radd__ __rsub__ __rmul__ __rtruediv__ __rfloordiv__ __rmod__ __rmatmul__ __rdivmod__ __rpow__ |
|
| 增强赋值算术 | += -= *= /= //= %= @= **= |
__iadd__ __isub__ __imul__ __itruediv__ __ifloordiv__ __imod__ __imatmul__ __ipow__ |
| 位运算 | & | ^ << >> ~ |
__and__ __or__ __xor__ __lshift__ __rshift__ __invert__ |
| 反向位运算(操作数对调的位运算符) | __rand__ __ror__ __rxor__ __rlshift__ __rrshift__ |
|
| 增强赋值位运算 | &= |= ^= <<= >>= |
__iand__ __ior__ __ixor__ __ilshift__ __irshift__ |
注意:当第一个操作数上对应的特殊方法不可用时,Python 会在第二个操作数上调用反向运算符特殊方法。增强赋值是“中缀运算符 + 变量赋值”的简写,比如 a += b。第 16 章详细解释反向运算符和增强赋值。