__new__ 负责创建实例对象(真正的构造器),__init__ 负责初始化已创建的实例。调用 Foo() 时,先执行 Foo.__new__(cls, ...) 返回一个对象;若返回的是 Foo 的实例,Python 再自动调用 __init__(self, ...) 做初始化;__init__ 必须返回 None。

class Singleton:
    _instance = None
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

需要重写 __new__ 的场景:

  • 单例/实例缓存:控制是否真正新建对象。
  • 继承不可变类型(int、str、tuple)时定制值:因为不可变对象创建后无法修改,__init__ 里改不了值,只能在 __new__ 阶段构造。
  • 元类编程、返回其他类的实例(工厂式构造)。

绝大多数类不需要碰 __new____init__ 即可。易错点:__new__ 是静态方法(隐式,无需 @staticmethod 声明),第一个参数是 cls 而非 self;忘记 super().__new__(cls) 返回对象会导致实例为 None;__new__ 返回非本类实例时 __init__ 不会执行。追问方向:单例的多种实现对比(装饰器、元类、模块级单例)、pickle 反序列化时走 __new__ 不走 __init__ 的细节。