Python魔术方法是以__开头结尾的特殊方法,用于定义对象在运算、打印、迭代、上下文管理等操作中的行为,使自定义类自然融入Python语法体系。

Python魔术方法(Magic Methods),也叫双下划线方法(Dunder Methods),是类中以__开头和结尾的特殊方法,用于定义对象在特定操作下的行为。它们不是用来“炫技”的,而是让自定义类能自然融入Python语法体系——比如支持+、len()、for循环、print()甚至上下文管理。
让对象像内置类型一样参与运算:__add__、__eq__、__lt__等
默认情况下,两个自定义实例无法直接用+相加,也不能用==比较是否“逻辑相等”。通过实现对应魔术方法,就能赋予这些操作明确含义。
-
__add__(self, other):定义a + b的行为,返回新对象(不修改原对象);若不支持,可返回NotImplemented,让Python尝试调用other.__radd__ -
__eq__(self, other):决定==是否为真;注意不要只写return self.name == other.name,要先检查other类型或用isinstance避免AttributeError -
__lt__(self, other)、__le__等:支持排序(如sorted())和heapq;配合@functools.total_ordering可减少重复编码
控制对象的“外观”和“存在感”:__str__、__repr__、__bool__
用户看到什么、调试时显示什么、条件判断怎么处理,都由这些方法决定。
-
__str__(self):面向用户,print(obj)或str(obj)调用;应简洁友好,比如"User: Alice" -
__repr__(self):面向开发者,repr(obj)或交互式环境直接输入变量名时调用;建议返回可执行的字符串形式,如"User(name='Alice', age=30)",便于调试和日志 -
__bool__(self):决定if obj:是True还是False;未定义时默认返回True;常见做法是根据核心属性判断,如return bool(self.items)(对容器类)
支持容器协议与迭代:__len__、__getitem__、__iter__、__contains__
让自定义类像list、dict一样被使用,无需额外封装函数。
立即学习“Python免费学习笔记(深入)”;
-
__len__(self):支持len(obj);必须返回非负整数,否则抛TypeError -
__getitem__(self, key):支持obj[key]、切片、for循环(如果没定义__iter__);遇到无效key应抛KeyError或IndexError -
__iter__(self):返回一个迭代器对象(通常用yield写生成器),优先级高于__getitem__;定义后for x in obj:才真正可用 -
__contains__(self, item):优化item in obj;若未定义,Python会退回到遍历__iter__,效率低
资源管理与上下文支持:__enter__、__exit__、__del__
确保关键资源(文件、连接、锁)安全获取与释放,避免泄漏。
-
__enter__(self):with语句开始时调用;通常返回self或所需资源对象 -
__exit__(self, exc_type, exc_val, exc_tb):无论是否异常都会执行;返回True可抑制异常,一般只在明确要吞掉特定错误时这么做;多数情况应返回None或False让异常继续传播 -
__del__(self):对象被垃圾回收前调用,**不可靠且不推荐依赖**;它不保证何时执行,也不保证一定执行;资源清理务必放在__exit__或显式.close()中
掌握这些核心魔术方法,能让类不再是“孤岛”,而是真正融入Python生态的有机部分。不追求全写,但关键行为(如打印、比较、长度、迭代)补上对应方法,代码可读性、复用性和健壮性会明显提升。










