张芷铭的个人博客

在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语句等)。掌握它们能极大提升代码的灵活性和可读性。

💬 评论