100 个 Python 特殊方法按照不同类别进行的分类整理
以下是将上述 100 个 Python 特殊方法按照不同类别进行的分类整理:
一、对象创建与初始化
__new__
:用于创建对象实例,在__init__
之前调用,常用于实现单例模式等特殊的实例创建逻辑。__init__
:对象初始化方法,在对象创建后调用,用于设置对象的初始属性。__init_subclass__
:在子类创建时被调用,可用于对所有子类进行统一的配置和管理。- 元类的
__init__
:在类创建后被调用,可用于对类进行初始化配置,如设置类的默认属性、绑定类方法等。
二、对象销毁与资源管理
__del__
:对象销毁时调用,用于释放对象占用的资源,但不保证一定会被调用。__enter__
和__exit__
:用于实现上下文管理器,在with
语句块进入和退出时分别调用,可用于资源的获取和释放,如文件操作、数据库连接等。__aenter__
和__aexit__
:异步上下文管理器的特殊方法,用于异步资源的管理,如异步文件操作、异步网络连接等。__aclose__
:用于异步地关闭资源,在异步迭代器、异步上下文管理器等场景中,当资源不再需要时进行优雅的关闭操作。
三、属性访问与描述符
__getattr__
:当访问对象不存在的属性时调用,可用于实现动态属性或属性的默认值。__setattr__
:在设置对象属性时调用,可用于对属性赋值进行拦截和验证。__delattr__
:在删除对象属性时调用,可用于实现属性删除的自定义逻辑。__getattribute__
:在访问对象任何属性时都会调用,比__getattr__
更优先,需谨慎使用以避免无限递归。- 描述符相关
__get__
:描述符协议方法,用于获取描述符管理的属性值。__set__
:用于设置描述符管理的属性值。__delete__
:用于删除描述符管理的属性时的逻辑处理。__set_name__
:Python 3.6 及以上版本新增,描述符被赋值给类的属性时调用,可获取所属类和属性名。
四、比较与排序
__lt__
:实现小于比较(<
)。__le__
:实现小于等于比较(<=
)。__eq__
:实现等于比较(==
)。__ne__
:实现不等于比较(!=
)。__gt__
:实现大于比较(>
)。__ge__
:实现大于等于比较(>=
)。__cmp__
(Python 2)**:Python 2 中用于比较两个对象,返回一个整数表示大小关系,Python 3 中可通过functools.total_ordering
装饰器结合__lt__
和__eq__
替代。
五、容器与序列操作
- 容器协议
__len__
:返回容器的长度,用于支持len()
函数。__getitem__
:实现通过索引或键访问容器元素,支持[]
操作。__setitem__
:实现通过索引或键设置容器元素,支持[]
赋值操作。__delitem__
:实现通过索引或键删除容器元素,支持del
操作。__contains__
:实现in
运算符的逻辑,用于判断元素是否在容器中。
- 序列操作
__iter__
:返回一个迭代器对象,使对象可用于for
循环等迭代操作。__next__
:迭代器的核心方法,用于返回迭代的下一个元素,当没有更多元素时抛出StopIteration
异常。__reversed__
:实现反转容器元素的顺序,支持reversed()
函数。__add__
和__radd__
:实现容器的拼接操作(+
),__radd__
处理反向拼接。__mul__
和__rmul__
:实现容器与整数的乘法操作(*
),用于重复容器元素,__rmul__
处理反向乘法。__iadd__
:实现就地拼接操作(+=
)。__imul__
:实现就地乘法操作(*=
)。__setslice__
(Python 2)和__setitem__
(Python 3 处理切片):实现切片赋值操作。__delslice__
(Python 2)和__delitem__
(Python 3 处理切片):实现切片删除操作。
六、映射操作
__missing__
:在自定义映射类型中,当访问不存在的键时调用,可用于实现默认值设置、缓存更新等逻辑。__setdefault__
:用于在映射中查找键,如果键不存在则设置默认值并返回,可重写实现自定义逻辑。__popitem__
:移除并返回映射中的任意键值对。__update__
:用于更新映射,可重写以实现自定义的更新逻辑。
七、数字运算
- 算术运算
__add__
和__radd__
:实现加法运算(+
),__radd__
处理反向加法。__sub__
和__rsub__
:实现减法运算(-
),__rsub__
处理反向减法。__mul__
和__rmul__
:实现乘法运算(*
),__rmul__
处理反向乘法。__truediv__
:实现真除法运算(/
)。__floordiv__
:实现整除运算(//
)。__mod__
和__rmod__
:实现取模运算(%
),__rmod__
处理反向取模。__pow__
和__rpow__
:实现幂运算(**
),__rpow__
处理反向幂运算。
- 位运算
__lshift__
:实现左移位运算(<<
)。__rshift__
:实现右移位运算(>>
)。__and__
和__rand__
:实现按位与运算(&
),__rand__
处理反向按位与。__or__
和__ror__
:实现按位或运算(|
),__ror__
处理反向按位或。__xor__
和__rxor__
:实现按位异或运算(^
),__rxor__
处理反向按位异或。__invert__
:实现按位取反运算(~
)。
- 就地运算
__iadd__
:实现就地加法运算(+=
)。__isub__
:实现就地减法运算(-=
)。__imul__
:实现就地乘法运算(*=
)。__itruediv__
:实现就地真除法运算(/=
)。__ifloordiv__
:实现就地整除运算(//=
)。__imod__
:实现就地取模运算(%=
)。__ipow__
:实现就地幂运算(**=
)。__ilshift__
:实现就地左移位运算(<<=
)。__irshift__
:实现就地右移位运算(>>=
)。__iand__
:实现就地按位与运算(&=
)。__ior__
:实现就地按位或运算(|=
)。__ixor__
:实现就地按位异或运算(^=
)。
八、迭代器与生成器
__aiter__
和__anext__
:用于实现异步迭代器,可用于异步文件读取、异步分页数据处理等异步场景。- 生成器相关:生成器函数本身是一种特殊的迭代器,通过
yield
关键字实现。虽然没有特定的特殊方法与之严格对应,但与迭代器协议紧密相关。
九、字符串表示
__str__
:返回对象的字符串表示,用于str()
函数和print()
函数的默认输出。__repr__
:返回对象的官方字符串表示,通常用于调试和开发环境,可通过repr()
函数调用。__format__
:自定义对象的格式化输出,配合format()
函数或f-string
使用。
十、异步编程
__await__
:用于将对象转换为可等待对象,可用于实现协程和异步任务的调度。- 异步锁相关:在异步编程中,虽然没有特定的特殊方法名,但涉及到
asyncio.Lock
等异步锁的使用,结合__aenter__
和__aexit__
方法实现异步资源的并发控制。
十一、元类相关
__prepare__
:元类的方法,返回一个命名空间对象,可用于设置类属性的默认值、应用类装饰器等,在类创建之前进行准备工作。__new__
(元类):在类创建时调用,可用于控制类的创建过程,如修改类的属性、基类等。__call__
(元类):在实例化类时调用,可用于实现单例模式、实例化钩子和拦截等功能。__instancecheck__
:控制isinstance()
函数的行为,可自定义实例检查逻辑。__subclasscheck__
:控制issubclass()
函数的行为,可自定义子类检查逻辑。
十二、模块相关
__all__
:模块级别的属性,用于控制from module import *
语句导入的内容,可动态更新以实现不同的导入策略。__loader__
:模块的属性,可指向一个自定义的模块加载器,用于从不同的数据源加载模块或对模块进行预处理。__dir__
:模块级别的方法,用于返回模块的属性列表,可自定义模块属性的可见性。