__new__负责创建对象,是接收cls的静态方法,必须返回实例才能触发__init__;__init__负责初始化,是实例方法,在__new__返回当前类实例后自动调用,不返回值。

__new__ 负责创建对象,__init__ 负责初始化对象。二者分工明确:一个造“壳”,一个填“瓤”。
__new__ 是真正的构造器
它是一个静态方法,接收类本身作为第一个参数(cls),必须返回一个实例(通常是 cls 的实例)。如果它不返回实例,__init__ 就不会被调用。
- 常用于实现单例、不可变类型(如 int/str 子类)、对象池等底层控制场景
- 若重写 __new__,记得调用父类的 __new__ 来获取实例,例如:super().__new__(cls)
- 返回其他类的实例时,Python 会跳过当前类的 __init__,转而调用那个类的 __init__
__init__ 是初始化方法
它是一个实例方法,在 __new__ 返回实例后自动调用,负责给刚创建的对象设置属性、执行初始化逻辑。它不需要返回值(或隐式返回 None)。
- 不能控制对象是否被创建,只负责“已有对象”的状态设置
- 如果 __new__ 返回的是当前类的实例,且未抛异常,__init__ 一定会被调用
- 常见错误:在 __init__ 里试图修改不可变对象(如 tuple、str 子类)的属性——应改在 __new__ 中处理
典型执行顺序与协作关系
以 obj = MyClass() 为例:
立即学习“Python免费学习笔记(深入)”;
- Python 调用 MyClass.__new__(MyClass, ...) → 得到实例 obj
- 若 __new__ 返回的是 MyClass 实例,再调用 obj.__init__(...)
- 若 __new__ 返回 None 或其他类型实例,__init__ 不执行或执行对应类型的 __init__
一个简单对比示例
下面代码演示两者分工:
class Demo:
def __new__(cls, value):
print("__new__ called")
instance = super().__new__(cls)
return instance
<pre class='brush:python;toolbar:false;'>def __init__(self, value):
print("__init__ called")
self.value = valued = Demo(42)










