特殊方法(魔法方法)是 Python 以 __xxx__ 格式命名的内置方法,由解释器自动调用,支持运算符重载、容器操作、迭代等功能。

核心特征

  1. 命名:双下划线包裹(__init__、__add__)
  2. 调用:由解释器自动触发,不手动调用
  3. 作用:让自定义类支持内置类型操作

对象生命周期

方法触发场景
__new__创建实例(__init__ 之前)
__init__初始化,obj = Class()
__del__对象被回收
__copy__浅复制
__deepcopy__深复制

运算符重载

class Num:
    def __init__(self, val): self.val = val
    def __add__(self, other): return Num(self.val + other.val)
 
a, b = Num(1), Num(2)
c = a + b  # 调用 a.__add__(b)

算术运算

方法运算符
__add__+
__sub__-
__mul__*
__truediv__/
__floordiv__//
__mod__%
__pow__**

反向运算

__radd__、__rsub__ 等(左操作数不支持时调用)

比较运算

方法运算符
__eq__==
__ne__!=
__lt__<
__gt__>
__le__<=
__ge__>=

赋值运算

__iadd__、__isub__ 等(+=、-=)

容器操作

方法触发场景
__len__len(obj)
__getitem__obj[i]、obj[1:3]
__setitem__obj[i] = val
__delitem__del obj[key]
__contains__x in obj

属性访问

方法说明
__getattr__访问不存在的属性
__getattribute__访问任意属性
__setattr__设置属性
__delattr__删除属性

拦截语义与完整查找流程见 属性访问与查找。

迭代

方法说明
__iter__返回迭代器
__next__返回下一元素
__reversed__反向迭代

字符串表示

方法触发场景
__str__print(obj)、str(obj)
__repr__交互式终端、repr(obj)
__format__format()、f-string

数值转换

方法触发场景
__bool__bool(obj)
__int__int(obj)
__float__float(obj)

上下文管理

方法说明
__enter__进入 with 块
__exit__离开 with 块

可调用与哈希

class Adder:
    def __call__(self, a, b): return a + b
 
add = Adder()
add(1, 2)  # 调用 add.__call__(1, 2)
方法说明
__call__对象可像函数一样调用
__hash__哈希值(用作字典键、集合元素)