“魔术方法”(Magic Methods),又叫 特殊方法 或 双下方法(dunder methods),是 Python 中以双下划线 __xxx__ 命名的函数。这些方法不是你直接调用的,而是由 Python 在特定操作时自动触发的。
例如:
- __init__ 会在对象创建时被调用;
- __str__ 会在使用 print(obj) 时调用;
- __add__ 会在使用 + 运算符时调用。
🧠 魔术方法的命名规则
所有魔术方法都遵循这样的命名格式:
__方法名__ (注意前后都有两个下划线)
你自己不要创建随意命名的双下方法,除非是在实现 Python 的约定接口。
🧩 魔术方法分类总览
✅ 1. 对象生命周期相关
__init__(self, …) | 初始化对象(构造函数) |
__new__(cls, …) | 创建对象(罕见) |
__del__(self) | 析构方法(对象被销毁时) |
✅ 2. 字符串表示与打印
__str__ | str(obj) 或 print(obj) 时调用 |
__repr__ | repr(obj)、控制台直接输入对象时调用 |
__format__ | "{:>10}".format(obj) 时调用 |
✅ 3. 算术运算符重载
__add__ | + | a + b |
__sub__ | – | a – b |
__mul__ | * | a * b |
__truediv__ | / | a / b |
__floordiv__ | // | a // b |
__mod__ | % | a % b |
__pow__ | ** | a ** b |
✅ 4. 比较运算符重载
__eq__ | == | a == b |
__ne__ | != | a != b |
__lt__ | < | a < b |
__le__ | <= | a <= b |
__gt__ | > | a > b |
__ge__ | >= | a >= b |
✅ 5. 容器/索引行为
__len__ | len(obj) |
__getitem__ | obj[key] |
__setitem__ | obj[key] = value |
__delitem__ | del obj[key] |
__iter__ | for x in obj |
__next__ | next(iterator) |
__contains__ | x in obj |
✅ 6. 上下文管理器(with)
__enter__ | 进入 with 语句块 |
__exit__ | 离开 with 语句块 |
✅ 7. 可调用对象
__call__ | obj() 时调用 |
✅ 8. 类行为相关
__getattr__ | 访问不存在属性时触发 |
__getattribute__ | 所有属性访问时触发(谨慎用) |
__setattr__ | 设置属性时触发 |
__delattr__ | 删除属性时触发 |
__dir__ | dir(obj) 时调用 |
__instancecheck__ | isinstance(obj, cls) |
__subclasscheck__ | issubclass(sub, cls) |
🎯 示例:自定义类重载 + 运算符
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Point(self.x + other.x, self.y + other.y)
def __str__(self):
return f"({self.x}, {self.y})"
p1 = Point(1, 2)
p2 = Point(3, 4)
print(p1 + p2) # 调用 __add__,输出: (4, 6)
✅ 总结
构造/销毁 | __init__, __del__ |
表示 | __str__, __repr__ |
运算符重载 | __add__, __eq__, 等等 |
容器行为 | __getitem__, __len__, 等等 |
上下文管理器 | __enter__, __exit__ |
函数模拟 | __call__ |
评论前必须登录!
注册