特殊方法(魔法方法)是 Python 以 __xxx__ 格式命名的内置方法,由解释器自动调用,支持运算符重载、容器操作、迭代等功能。
核心特征
- 命名:双下划线包裹(
__init__、__add__)
- 调用:由解释器自动触发,不手动调用
- 作用:让自定义类支持内置类型操作
对象生命周期
| 方法 | 触发场景 |
|---|
__new__ | 创建实例(__init__ 之前) |
__init__ | 初始化,obj = Class() |
__del__ | 对象被回收 |
__copy__ | 浅复制 |
__deepcopy__ | 深复制 |
运算符重载
class Num:
def __init__(self, val): self.val = val
def __add__(self, other): return Num(self.val + other.val)
a, b = Num(1), Num(2)
c = a + b # 调用 a.__add__(b)
算术运算
| 方法 | 运算符 |
|---|
__add__ | + |
__sub__ | - |
__mul__ | * |
__truediv__ | / |
__floordiv__ | // |
__mod__ | % |
__pow__ | ** |
反向运算
__radd__、__rsub__ 等(左操作数不支持时调用)
比较运算
| 方法 | 运算符 |
|---|
__eq__ | == |
__ne__ | != |
__lt__ | < |
__gt__ | > |
__le__ | <= |
__ge__ | >= |
赋值运算
__iadd__、__isub__ 等(+=、-=)
容器操作
| 方法 | 触发场景 |
|---|
__len__ | len(obj) |
__getitem__ | obj[i]、obj[1:3] |
__setitem__ | obj[i] = val |
__delitem__ | del obj[key] |
__contains__ | x in obj |
属性访问
| 方法 | 说明 |
|---|
__getattr__ | 访问不存在的属性 |
__getattribute__ | 访问任意属性 |
__setattr__ | 设置属性 |
__delattr__ | 删除属性 |
拦截语义与完整查找流程见 属性访问与查找。
迭代
| 方法 | 说明 |
|---|
__iter__ | 返回迭代器 |
__next__ | 返回下一元素 |
__reversed__ | 反向迭代 |
字符串表示
| 方法 | 触发场景 |
|---|
__str__ | print(obj)、str(obj) |
__repr__ | 交互式终端、repr(obj) |
__format__ | format()、f-string |
数值转换
| 方法 | 触发场景 |
|---|
__bool__ | bool(obj) |
__int__ | int(obj) |
__float__ | float(obj) |
上下文管理
| 方法 | 说明 |
|---|
__enter__ | 进入 with 块 |
__exit__ | 离开 with 块 |
可调用与哈希
class Adder:
def __call__(self, a, b): return a + b
add = Adder()
add(1, 2) # 调用 add.__call__(1, 2)
| 方法 | 说明 |
|---|
__call__ | 对象可像函数一样调用 |
__hash__ | 哈希值(用作字典键、集合元素) |