跳转到内容

特殊方法速查

这两张表是第 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 章详细解释反向运算符和增强赋值。