常见的 Python 特殊方法与作用分类整理
一、对象创建与初始化
- __new__:用于创建对象实例,在- __init__之前调用,常用于实现单例模式等特殊的实例创建逻辑。
- __init__:对象初始化方法,在对象创建后调用,用于设置对象的初始属性。
- __init_subclass__:在子类创建时被调用,可用于对所有子类进行统一的配置和管理。
- 元类的 __init__:在类创建后被调用,可用于对类进行初始化配置,如设置类的默认属性、绑定类方法等。
- __post_init__:在- __init__之后调用,常用于- dataclasses模块中,对初始化后的属性做进一步处理。
二、对象销毁与资源管理
- __del__:对象销毁时调用,用于释放对象占用的资源,但不保证一定会被调用。
- __enter__和- __exit__:用于实现上下文管理器,在- with语句块进入和退出时分别调用,可用于资源的获取和释放,如文件操作、数据库连接等。
- __aenter__和- __aexit__:异步上下文管理器的特殊方法,用于异步资源的管理,如异步文件操作、异步网络连接等。
- __aclose__:用于异步地关闭资源,在异步迭代器、异步上下文管理器等场景中,当资源不再需要时进行优雅的关闭操作。
三、属性访问与描述符
- __getattr__:当访问对象不存在的属性时调用,可用于实现动态属性或属性的默认值。
- __setattr__:在设置对象属性时调用,可用于对属性赋值进行拦截和验证。
- __delattr__:在删除对象属性时调用,可用于实现属性删除的自定义逻辑。
- __getattribute__:在访问对象任何属性时都会调用,比- __getattr__更优先,需谨慎使用以避免无限递归。
- 描述符相关
- __get__:描述符协议方法,用于获取描述符管理的属性值。
- __set__:用于设置描述符管理的属性值。
- __delete__:用于删除描述符管理的属性时的逻辑处理。
- __set_name__:Python 3.6 及以上版本新增,描述符被赋值给类的属性时调用,可获取所属类和属性名。
- __getstate__:在对象被序列化(如- pickle模块)时调用,用于返回对象的状态。
- __setstate__:在对象被反序列化时调用,用于恢复对象的状态。
 
四、比较与排序
- __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 处理切片):实现切片删除操作。
- __reversed__:返回一个反向迭代器,用于反向遍历序列。
- __index__:用于将对象作为整数索引使用,例如在切片操作中。
 
六、映射操作
- __missing__:在自定义映射类型中,当访问不存在的键时调用,可用于实现默认值设置、缓存更新等逻辑。
- __setdefault__:用于在映射中查找键,如果键不存在则设置默认值并返回,可重写实现自定义逻辑。
- __popitem__:移除并返回映射中的任意键值对。
- __update__:用于更新映射,可重写以实现自定义的更新逻辑。
- __keys__:返回映射中所有键的视图。
- __values__:返回映射中所有值的视图。
- __items__:返回映射中所有键值对的视图。
七、数字运算
- 算术运算
- __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__:实现就地按位异或运算(- ^=)。
 
- 一元运算
- __neg__:实现取负运算(- -x)。
- __pos__:实现取正运算(- +x)。
- __abs__:实现取绝对值运算(- abs(x))。
- __invert__:实现按位取反运算(- ~x)。
 
八、迭代器与生成器
- __aiter__和- __anext__:用于实现异步迭代器,可用于异步文件读取、异步分页数据处理等异步场景。
- 生成器相关:生成器函数本身是一种特殊的迭代器,通过 yield关键字实现。虽然没有特定的特殊方法与之严格对应,但与迭代器协议紧密相关。
- __iter__和- __next__:用于实现同步迭代器,- __iter__返回迭代器对象,- __next__返回下一个元素。
九、字符串表示
- __str__:返回对象的字符串表示,用于- str()函数和- print()函数的默认输出。
- __repr__:返回对象的官方字符串表示,通常用于调试和开发环境,可通过- repr()函数调用。
- __format__:自定义对象的格式化输出,配合- format()函数或- f-string使用。
- __bytes__:返回对象的字节表示,用于- bytes()函数。
十、异步编程
- __await__:用于将对象转换为可等待对象,可用于实现协程和异步任务的调度。
- 异步锁相关:在异步编程中,虽然没有特定的特殊方法名,但涉及到 asyncio.Lock等异步锁的使用,结合__aenter__和__aexit__方法实现异步资源的并发控制。
- __aiter__和- __anext__:用于实现异步迭代器,支持异步循环。
十一、元类相关
- __prepare__:元类的方法,返回一个命名空间对象,可用于设置类属性的默认值、应用类装饰器等,在类创建之前进行准备工作。
- __new__(元类):在类创建时调用,可用于控制类的创建过程,如修改类的属性、基类等。
- __call__(元类):在实例化类时调用,可用于实现单例模式、实例化钩子和拦截等功能。
- __instancecheck__:控制- isinstance()函数的行为,可自定义实例检查逻辑。
- __subclasscheck__:控制- issubclass()函数的行为,可自定义子类检查逻辑。
十二、模块相关
- __all__:模块级别的属性,用于控制- from module import *语句导入的内容,可动态更新以实现不同的导入策略。
- __loader__:模块的属性,可指向一个自定义的模块加载器,用于从不同的数据源加载模块或对模块进行预处理。
- __dir__:模块级别的方法,用于返回模块的属性列表,可自定义模块属性的可见性。
- __spec__:模块的规范对象,包含模块的相关元数据,如加载器、源文件路径等。
十三、哈希与集合操作
- __hash__:返回对象的哈希值,用于支持将对象作为字典的键或集合的元素。
- __eq__:在判断对象是否相等时调用,通常与- __hash__一起实现,以保证哈希表的正确性。
- __ior__:实现就地并集更新(- |=)。
- __iand__:实现就地交集更新(- &=)。
- __isub__:实现就地差集更新(- -=)。
- __ixor__:实现就地对称差集更新(- ^=)。
 
                    
                     
                    
                 
                    
                 
                
 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号