Python 魔术方法功能分类指南
一、对象生命周期管理
1. 对象创建与初始化
-
**
__new__(cls)
**
触发场景:实例化对象时第一个执行的方法
功能:控制内存分配,常用于单例模式或资源预检查 -
**
__init__(self)
**
触发场景:对象创建后初始化属性
功能:设置对象初始状态(如成员变量赋值) -
**
__del__(self)
**
触发场景:对象引用计数归零或程序终止时
功能:资源回收(慎用,建议使用上下文管理器替代)
方法名 | 触发场景 | 功能描述 | 入参 | 注意事项 |
---|---|---|---|---|
__new__ | 实例化对象时 | 控制内存分配与实例创建 | cls +构造参数 | 必须返回实例对象,常用于单例模式设计 |
__init__ | 对象初始化阶段 | 设置初始属性值 | self +构造参数 | 在__new__ 之后执行,不能返回非None值 |
__del__ | 对象引用计数归零时 | 资源回收处理 | self | 执行时机不可靠,建议优先使用上下文管理器 |
二、对象表示与字符串转换
1. 用户友好显示
- **
__str__(self)
**
触发场景:调用print(obj)
或str(obj)
功能:返回可读性强的字符串,面向终端用户
2. 开发调试显示
- **
__repr__(self)
**
触发场景:交互式环境直接输出对象或调用repr(obj)
功能:返回精确的表达式字符串,用于重建对象
方法名 | 触发场景 | 功能描述 | 返回值要求 | 注意事项 |
---|---|---|---|---|
__str__ | print(obj) 或str() 调用 | 生成用户友好显示内容 | 字符串 | 优先于__repr__ 执行,适用于终端输出 |
__repr__ | repr(obj) 或交互式环境显示 | 生成开发者调试信息 | 可执行表达式字符串 | 应满足eval(repr(obj)) == obj 原则 |
三、运算符重载
1. 算术运算
- **
__add__(self, other)
**:+
运算 - **
__sub__(self, other)
**:-
运算 - **
__mul__(self, other)
**:*
运算
方法名 | 对应运算符 | 触发场景 | 参数要求 | 注意事项 |
---|---|---|---|---|
__add__ | + | 加法操作 | self, other | 需同时实现反向运算__radd__ |
__sub__ | - | 减法操作 | self, other | 需处理非数值类型操作数异常 |
2. 比较运算
- **
__eq__(self, other)
**:==
判断 - **
__lt__(self, other)
**:<
判断 - **
__ge__(self, other)
**:>=
判断
方法名 | 对应运算符 | 触发场景 | 返回值要求 | 注意事项 |
---|---|---|---|---|
__eq__ | == | 相等性判断 | 布尔值 | 需同时实现__hash__ 保证哈希一致性 |
__lt__ | < | 小于比较 | 布尔值 | 建议实现全部比较运算符保证逻辑完整性 |
3. 增量赋值
- **
__iadd__(self, other)
**:+=
运算 - **
__isub__(self, other)
**:-=
运算
四、容器协议支持
1. 基础操作
-
**
__len__(self)
**
触发场景:调用len(obj)
功能:返回容器元素数量 -
**
__getitem__(self, key)
**
触发场景:obj[key]
索引访问
功能:支持切片/字典键访问等操作 -
**
__setitem__(self, key, value)
**
触发场景:obj[key] = value
赋值操作
方法名 | 触发场景 | 功能描述 | 参数要求 | 注意事项 |
---|---|---|---|---|
__len__ | len(obj) 调用 | 返回容器元素数量 | self | 必须返回非负整数 |
__getitem__ | obj[key] 操作 | 获取指定索引元素 | self, key | 需处理KeyError异常 |
__iter__ | for...in 循环 | 返回迭代器对象 | self | 需配合__next__ 实现完整迭代协议 |
2. 高级容器行为
-
**
__contains__(self, item)
**
触发场景:item in obj
成员关系判断 -
**
__reversed__(self)
**
触发场景:调用reversed(obj)
功能:自定义反向迭代逻辑
五、属性动态管理
1. 访问控制
-
**
__getattr__(self, name)
**
触发场景:访问不存在的属性时触发 -
**
__setattr__(self, name, value)
**
触发场景:设置任何属性值时触发 -
**
__getattribute__(self, name)
**
触发场景:所有属性访问均触发(需避免递归调用) -
**
__delattr__(self, name)
**
触发场景:删除属性时触发
方法名 | 触发场景 | 功能描述 | 参数要求 | 注意事项 |
---|---|---|---|---|
__getattr__ | 访问不存在的属性时 | 动态属性处理 | self, name | 需与__getattribute__ 区分执行优先级 |
__setattr__ | 设置任何属性时 | 属性赋值拦截 | self, name, value | 需调用object.__setattr__ 防止递归调用 |
六、可调用对象
- **
__call__(self, *args)
**
触发场景:将实例作为函数调用(如obj()
)
功能:实现装饰器类或函数式对象
七、上下文管理
-
**
__enter__(self)
**
触发场景:进入with
语句块时
功能:返回上下文资源(如打开文件对象) -
**
__exit__(self, exc_type, exc_val, traceback)
**
触发场景:退出with
语句块时
功能:处理异常与资源释放
方法名 | 触发场景 | 功能描述 | 参数要求 | 注意事项 |
---|---|---|---|---|
__enter__ | 进入with 语句块时 | 返回上下文资源对象 | self | 通常与资源获取操作配合使用 |
__exit__ | 退出with 语句块时 | 处理异常与资源释放 | self, exc_type, exc_val, traceback | 需返回布尔值控制异常传播 |
八、反射与类型检查
-
**
__instancecheck__(self, instance)
**
触发场景:调用isinstance(obj, cls)
功能:自定义实例类型检查逻辑 -
**
__subclasscheck__(self, subclass)
**
触发场景:调用issubclass(subcls, cls)
功能:控制子类判断逻辑
方法名 | 触发场景 | 功能描述 | 返回值要求 | 注意事项 |
---|---|---|---|---|
__instancecheck__ | isinstance() 调用 | 自定义实例类型判断 | 布尔值 | 需在元类中实现 |
__subclasscheck__ | issubclass() 调用 | 自定义子类关系判断 | 布尔值 | 需在元类中重写 |
九、协程与异步支持
-
**
__await__(self)
**
触发场景:在协程中使用await obj
功能:生成协程对象 -
**
__aiter__(self)
** 与 **__anext__(self)
**
触发场景:异步迭代时调用
功能:实现异步迭代器协议
方法名 | 触发场景 | 功能描述 | 参数要求 | 注意事项 |
---|---|---|---|---|
__await__ | await obj 调用 | 生成协程对象 | self | 需返回生成器对象 |
__aiter__ | 异步迭代开始时 | 返回异步迭代器 | self | 需配合__anext__ 实现完整协议 |
十、数学运算扩展
- **
__abs__(self)
**:abs(obj)
调用时触发 - **
__round__(self, n)
**:round(obj, n)
调用时触发 - **
__int__(self)
**:int(obj)
类型转换时触发
方法名 | 触发场景 | 功能描述 | 返回值要求 | 注意事项 |
---|---|---|---|---|
__abs__ | abs(obj) 调用 | 返回绝对值 | 数值 | 需保持数学运算一致性 |
__int__ | int(obj) 调用 | 类型转换为整型 | 整数 | 应实现配套的__float__ 方法 |