Python 的“魔术方法”(形如 __name__())是对象模型的核心接口。
它们决定了对象在布尔测试、数值计算、字符串表示、运算符重载、容器语义、上下文管理、异步编程、类与元类创建等场景下的表现。
掌握这些方法,能让自定义类像内置类型一样自然地参与各种语法与操作。
Type Conversion & Coercion
布尔上下文:__bool__()、__len__()
数值转换:__int__()、__float__()、__complex__()、__index__()
字符串与表示:__str__()、__repr__()、__format__()、__bytes__()
数值取整:__trunc__()、__round__()、__floor__()、__ceil__()
详情请参阅:
Container & Capability
对象能否像容器、上下文或可调用对象那样使用。
容器协议:__len__()、__getitem__()、__setitem__()、__delitem__()、__iter__()、__next__()、__contains__()
上下文管理:__enter__()/__exit__()、__aenter__()/__aexit__()
属性与描述符:__get__()、__set__()、__delete__()、__set_name__()
可调用与拷贝:__call__()、__copy__()、__deepcopy__()
哈希与序列化:__hash__()、__reduce__()、__getstate__()、__getnewargs__()
迭代与其他:__missing__()、__reversed__()、__await__()、__aiter__()/__anext__()、__fspath__v、__length_hint__()
内存信息:__sizeof__()
详情请参阅:
Comparison
对象如何判等与排序。
相等性:__eq__()、__ne__()
大小关系:__lt__()、__le__()、__gt__()、__ge__()
详情请参阅:
Arithmetic
让对象支持 +、-、*、/、//、 %、 **、 @ 、divmod() 等算术运算。
一元:__pos__()、__neg__()、__abs__()
二元三件套:如 __add__()、__radd__()、__iadd__() 等
矩阵乘法:__matmul__()、__rmatmul__()、__imatmul__()
商余:__divmod__()、__rdivmod__()、__idivmod__()
详情请参阅:
Bitwise
位级逻辑运算符的重载。
按位取反:__invert__()
按位与:__and__()、__rand__()、__iand__()
按位或:__or__()、__ror__()、__ior__()
按位异或:__xor__()、__rxor__()、__ixor__()
按位左移:__lshift__()、__rlshift__()、__ilshift__()
按位右移:__rshift__()、__rrshift__()、__irshift__()
详情请参阅:
Object, Class & Metaclass
控制对象生命周期与类的生成。
生命周期:__new__()、__init__()、__del__()
属性访问:__getattribute__()、__getattr__()、__setattr__()、__delattr__()、__dir__()
类型检查:__instancecheck__()、__subclasscheck__()、__subclasshook__()
类扩展:__init_subclass__()、__class_getitem__()
元类阶段:__prepare__()、meta.__new__()
导入钩子:__import__()
详情请参阅:
⚠️常见陷阱
1、哈希不一致:重写 __eq__() 却忘了同步 __hash__()。
2、属性递归:误用 __getattribute__() 导致无限循环。
3、就地运算破坏不可变语义:__iadd__() 修改了本应不可变的对象。
4、返回错误类型:如 __index__() 必须返回 int。
5、错误异常:不支持的操作应返回 NotImplemented 而非随意抛错。
小结
特殊方法让 Python 类型具备“语法即接口”的特性。
当你正确实现这些方法时,自定义类能像内置数值、容器或上下文一样自然地工作。
“点赞有美意,赞赏是鼓励”
热门跟贴