CodeWalk

__new__ vs __init__ 区别详解

作者:Yahuda · 2026-05-30 12:55

请详细说明Python中__new____init__的区别、调用顺序以及各自职责。何时必须重写__new__而非__init__?两者在元类中如何分工?给出不可变对象子类化和单例模式的示例说明它们的协作。

回答

Yahuda

__new__是真正创建实例的静态方法,__init__是初始化已创建实例的方法。

调用顺序__new____init__。只有__new__返回实例(且是该类实例)时,__init__才会自动被调用。

特性__new____init__
职责分配内存、创建实例初始化实例属性
参数(cls, ...)(self, ...)
返回值必须返回实例必须返回None
调用时机类调用时最先执行__new__返回后才执行

必须重写__new__的场景

  1. 继承不可变类型(如intstrtuple):__new__才有机会在对象创建前设置值
  2. 单例模式:控制实例创建
  3. 元类中创建类对象
# 单例
class Singleton:
    _instance = None
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance