常见的魔法方法按功能可分为七类,具体如下:
第一类:对象的“出生”与“销毁
- __init__:构造函数,在对象初始化时自动调用,用于设置对象的初始状态或属性。例如,定义类时通过该方法为实例绑定属性。
- __del__:析构函数,在对象销毁时自动调用(如对象引用计数归零或程序退出时),通常用于释放资源(如关闭文件)。
- __new__:创建对象本体,比__init__更早执行,负责实例化类本身。常用于单例模式或不可变类型的子类化(如tuple、str)。
第二类:对象怎么“被打印”
- __str__:定义对象的字符串表示形式,当使用print()或str()时自动调用。返回的字符串应面向用户,简洁易读。
- __repr__:定义对象的“官方”字符串表示,通常用于调试或开发场景。若未定义__str__,则回退到__repr__。
第三类:运算符重载通过重载运算符(如+、-、==等),使对象支持类似内置类型的操作。例如:
- __add__:重载+运算符,实现对象相加。
- __eq__:重载==运算符,定义对象相等的逻辑。
- __lt__、__gt__:重载比较运算符(如<、>),支持对象排序。
第四类:支持索引、遍历、len()等操作
- __getitem__:使对象支持索引操作(如obj[key]),常用于实现序列或字典类行为。
- __iter__:返回一个迭代器对象,使对象可被遍历(如for循环)。
- __len__:返回对象的长度,使len(obj)可调用。
第五类:让对象能像函数一样调用
- __call__:定义对象的调用行为,使实例可像函数一样通过obj()调用。常用于实现装饰器或状态机。
第六类:上下文管理器(配合with使用)
- __enter__:进入with块时调用,通常用于资源分配(如打开文件)。
- __exit__:退出with块时调用,用于资源释放或异常处理(如关闭文件)。
第七类:对象的真假值和哈希值
- __bool__:定义对象的布尔值(True或False),若未定义则回退到__len__(非零长度为True)。
- __hash__:定义对象的哈希值,使对象可作为字典的键或集合的元素。需确保哈希值稳定且相等对象哈希值相同。