__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__ 的细节。