附录 B 常用魔术方法速查表
对象创建与销毁
| 方法 | 触发时机 | 说明 |
|---|---|---|
__new__(cls) | 创建实例 | 返回新实例,很少重写 |
__init__(self) | 初始化实例 | 设置实例属性 |
__del__(self) | 对象销毁 | 析构方法,避免依赖 |
字符串表示
| 方法 | 触发时机 | 说明 |
|---|---|---|
__repr__(self) | repr(obj) | 开发者表示,应无歧义 |
__str__(self) | str(obj), print(obj) | 用户友好表示 |
__format__(self, spec) | format(obj), f"{obj}" | 格式化输出 |
__bytes__(self) | bytes(obj) | 字节串表示 |
比较运算
| 方法 | 运算符 | 说明 |
|---|---|---|
__eq__(self, other) | == | 相等 |
__ne__(self, other) | != | 不等 |
__lt__(self, other) | < | 小于 |
__le__(self, other) | <= | 小于等于 |
__gt__(self, other) | > | 大于 |
__ge__(self, other) | >= | 大于等于 |
__hash__(self) | hash(obj) | 哈希值 |
__bool__(self) | bool(obj), if obj | 真值判断 |
算术运算
| 方法 | 运算符 | 反向 | 就地 |
|---|---|---|---|
__add__ | + | __radd__ | __iadd__ |
__sub__ | - | __rsub__ | __isub__ |
__mul__ | * | __rmul__ | __imul__ |
__truediv__ | / | __rtruediv__ | __itruediv__ |
__floordiv__ | // | __rfloordiv__ | __ifloordiv__ |
__mod__ | % | __rmod__ | __imod__ |
__pow__ | ** | __rpow__ | __ipow__ |
__matmul__ | @ | __rmatmul__ | __imatmul__ |
一元运算
| 方法 | 运算符 |
|---|---|
__neg__(self) | -obj |
__pos__(self) | +obj |
__abs__(self) | abs(obj) |
__invert__(self) | ~obj |
位运算
| 方法 | 运算符 | 反向 | 就地 |
|---|---|---|---|
__and__ | & | __rand__ | __iand__ |
__or__ | | | __ror__ | __ior__ |
__xor__ | ^ | __rxor__ | __ixor__ |
__lshift__ | << | __rlshift__ | __ilshift__ |
__rshift__ | >> | __rrshift__ | __irshift__ |
类型转换
| 方法 | 触发时机 |
|---|---|
__int__(self) | int(obj) |
__float__(self) | float(obj) |
__complex__(self) | complex(obj) |
__index__(self) | 切片索引、bin()、hex() |
__round__(self, n) | round(obj, n) |
__trunc__(self) | math.trunc(obj) |
__floor__(self) | math.floor(obj) |
__ceil__(self) | math.ceil(obj) |
容器协议
| 方法 | 触发时机 | 说明 |
|---|---|---|
__len__(self) | len(obj) | 长度 |
__getitem__(self, key) | obj[key] | 取值 |
__setitem__(self, key, val) | obj[key] = val | 赋值 |
__delitem__(self, key) | del obj[key] | 删除 |
__contains__(self, item) | item in obj | 成员检测 |
__iter__(self) | iter(obj), for x in obj | 返回迭代器 |
__next__(self) | next(obj) | 下一个值 |
__reversed__(self) | reversed(obj) | 反向迭代器 |
__missing__(self, key) | dict[key] 键不存在时 | 仅 dict 子类 |
属性访问
| 方法 | 触发时机 | 说明 |
|---|---|---|
__getattr__(self, name) | 属性未找到时 | 兜底方法 |
__getattribute__(self, name) | 每次属性访问 | 优先于 __getattr__ |
__setattr__(self, name, val) | obj.attr = val | 属性赋值 |
__delattr__(self, name) | del obj.attr | 删除属性 |
__dir__(self) | dir(obj) | 属性列表 |
描述符
| 方法 | 触发时机 |
|---|---|
__get__(self, obj, type) | 读取属性 |
__set__(self, obj, value) | 设置属性 |
__delete__(self, obj) | 删除属性 |
__set_name__(self, owner, name) | 类创建时 |
上下文管理
| 方法 | 触发时机 |
|---|---|
__enter__(self) | with 语句进入 |
__exit__(self, exc_type, exc_val, exc_tb) | with 语句退出 |
__aenter__(self) | async with 进入 |
__aexit__(self, ...) | async with 退出 |
类创建与元编程
| 方法 | 触发时机 |
|---|---|
__init_subclass__(cls) | 子类被创建时 |
__class_getitem__(cls, item) | MyClass[int] |
__prepare__(mcs, name, bases) | 类体执行前(元类) |
__instancecheck__(cls, inst) | isinstance() |
__subclasscheck__(cls, sub) | issubclass() |
其他
| 方法 | 触发时机 |
|---|---|
__call__(self, ...) | obj(...) |
__len__(self) | len(obj) |
__sizeof__(self) | sys.getsizeof(obj) |
__slots__ | 声明固定属性(不是方法) |
__dict__ | 实例属性字典 |
__class__ | 实例的类 |
__match_args__ | match-case 位置模式 |