在Python中,特殊方法(也称为“魔法方法”)是一类以双下划线__开头和结尾的方法,用于实现对象的特殊行为(如运算符重载、属性访问控制、迭代等)。它们通常由Python解释器自动调用,而非直接通过对象调用。以下是Python中最重要的特殊方法分类及详解:
一、对象创建与销毁
用于对象的初始化、销毁及复制等生命周期管理。
| 方法 | 说明 |
|---|
__new__(cls, *args, **kwargs) | 创建对象的第一个方法(在__init__之前调用),返回实例本身(通常用于不可变类型或单例模式)。 |
__init__(self, *args, **kwargs) | 初始化对象(构造方法),在对象创建后自动调用,用于设置初始状态。 |
__del__(self) | 销毁对象时调用(析构方法),何时执行由垃圾回收机制决定,不建议依赖。 |
__copy__(self) | 定义浅复制行为(copy.copy()时调用)。 |
__deepcopy__(self, memo) | 定义深复制行为(copy.deepcopy()时调用)。 |
二、运算符重载
用于自定义对象对运算符的响应(如+、==、[]等)。
1. 算术运算符
| 方法 | 说明 | 对应运算符 |
|---|
__add__(self, other) | 加法 | self + other |
__sub__(self, other) | 减法 | self - other |
__mul__(self, other) | 乘法 | self * other |
__truediv__(self, other) | 真除法(浮点数结果) | self / other |
__floordiv__(self, other) | 地板除(整数结果) | self // other |
__mod__(self, other) | 取模 | self % other |
__pow__(self, other) | 幂运算 | self **other |
2. 反向算术运算符(当左操作数不支持时调用右操作数)
| 方法 | 说明 | 对应场景 |
|---|
__radd__(self, other) | 反向加法 | other + self |
__rsub__(self, other) | 反向减法 | other - self |
| …(其余类似) | … | … |
3. 比较运算符
| 方法 | 说明 | 对应运算符 |
|---|
__eq__(self, other) | 等于 | self == other |
__ne__(self, other) | 不等于 | self != other |
__lt__(self, other) | 小于 | self < other |
__gt__(self, other) | 大于 | self > other |
__le__(self, other) | 小于等于 | self <= other |
__ge__(self, other) | 大于等于 | self >= other |
4. 赋值运算符(结合算术运算的赋值)
| 方法 | 说明 | 对应运算符 |
|---|
__iadd__(self, other) | 加法赋值 | self += other |
__isub__(self, other) | 减法赋值 | self -= other |
| …(其余类似) | … | … |
5. 容器相关运算符
| 方法 | 说明 | 对应操作 |
|---|
__getitem__(self, key) | 获取元素(索引/切片) | self[key] |
__setitem__(self, key, value) | 设置元素 | self[key] = value |
__delitem__(self, key) | 删除元素 | del self[key] |
__contains__(self, item) | 判断元素是否存在 | item in self |
三、属性访问控制
用于自定义对象属性的获取、设置和删除逻辑。
| 方法 | 说明 |
|---|
__getattr__(self, name) | 当访问不存在的属性时调用(仅针对未定义的属性)。 |
__getattribute__(self, name) | 访问任何属性时都会调用(需谨慎使用,避免递归)。 |
__setattr__(self, name, value) | 设置属性时调用(self.name = value 会触发)。 |
__delattr__(self, name) | 删除属性时调用(del self.name 会触发)。 |
__dir__(self) | 自定义dir(obj)返回的属性列表。 |
四、迭代相关
使对象支持迭代(如for循环)。
| 方法 | 说明 |
|---|
__iter__(self) | 返回迭代器对象(自身或其他迭代器),是支持迭代的核心方法。 |
__next__(self) | 迭代器的方法,返回下一个元素,没有元素时触发StopIteration异常。 |
__reversed__(self) | 定义reversed(obj)的行为,返回反向迭代器。 |
五、字符串表示
控制对象转换为字符串的行为(用于打印、调试等)。
| 方法 | 说明 |
|---|
__str__(self) | 返回对象的“友好可读”字符串(str(obj)或print(obj)时调用)。 |
__repr__(self) | 返回对象的“官方/调试”字符串(repr(obj)或交互式解释器中调用),理想情况下eval(repr(obj))应可重建对象。 |
__format__(self, format_spec) | 自定义format(obj, format_spec)的格式化逻辑。 |
六、数值转换与布尔判断
控制对象转换为其他类型或判断真假的行为。
| 方法 | 说明 |
|---|
__bool__(self) | 定义对象的布尔值(bool(obj)时调用),若未定义则用__len__判断(非零为True)。 |
__int__(self) | 转换为整数(int(obj)时调用)。 |
__float__(self) | 转换为浮点数(float(obj)时调用)。 |
__complex__(self) | 转换为复数(complex(obj)时调用)。 |
七、上下文管理器(with语句)
使对象支持with语句(自动资源管理,如文件关闭)。
| 方法 | 说明 |
|---|
__enter__(self) | 进入with块时调用,返回的对象会赋值给as后的变量。 |
__exit__(self, exc_type, exc_val, exc_tb) | 离开with块时调用,处理异常或释放资源(返回True可抑制异常)。 |
八、其他重要方法
| 方法 | 说明 |
|---|
__len__(self) | 返回对象长度(len(obj)时调用),常用于容器类型。 |
__call__(self, *args, **kwargs) | 使对象可被调用(如obj()),将对象当作函数使用。 |
__hash__(self) | 定义对象的哈希值(hash(obj)时调用),用于字典键等哈希表场景,需与__eq__保持一致(相等的对象哈希值必须相同)。 |
__class__ | 实例所属的类(非方法,但常用,如obj.__class__)。 |
总结
特殊方法是Python面向对象编程的核心机制,通过重载这些方法,可以让自定义对象表现得像内置类型一样自然(如支持+、for循环、with语句等)。掌握它们能极大提升代码的灵活性和可读性。
💬 评论