__new__是构造器,负责创建并返回实例;__init__是初始化器,在实例存在后设置状态。__new__必须返回实例且为静态方法,__init__无需返回值且为实例方法。

new 和 init 的核心职责不同
__new__ 是真正的“构造器”,负责创建并返回一个类的实例对象;__init__ 是“初始化器”,在实例已存在后,负责设置其初始状态。
关键点:没有 __new__ 返回实例,__init__ 根本不会被调用。Python 在创建对象时,先调用 __new__ 得到对象,再把该对象传给 __init__ 做初始化。
new 必须返回实例,init 无需返回值
__new__ 是静态方法(第一个参数是 cls),必须显式返回一个实例(通常是 super().__new__(cls)),否则后续流程中断;__init__ 是实例方法(第一个参数是 self),只做属性赋值等操作,返回值会被忽略(即使写了 return 也没用)。
常见错误示例:
立即学习“Python免费学习笔记(深入)”;
- 在 __new__ 中忘了 return,导致得到 None,接着报 TypeError: __init__() missing 1 required positional argument: 'self'
- 在 __init__ 中写 return self 或 return True —— 无意义,也不影响对象创建
new 是控制对象生成的关键入口
由于 __new__ 在对象诞生前就介入,它可用于实现单例、不可变类型、对象池、类型转换等底层控制逻辑。
典型场景举例:
- 单例模式:检查类是否已有实例,有则直接返回,跳过新建和初始化
- int/str 子类复用缓存对象:如小整数(-5~256)或短字符串,__new__ 可返回已有对象,避免重复创建
- 禁止实例化:在 __new__ 中直接抛异常或返回其他类型,让类无法生成自身实例
init 更适合日常业务逻辑初始化
__init__ 接收的是已经构造好的对象,安全、直观,适合处理参数校验、属性赋值、资源预加载等常规初始化工作。
注意边界:
- 不要在 __init__ 中尝试修改对象身份(如替换 self)——无效,self 是不可重绑定的引用
- 若需深度定制构造过程(比如根据参数决定创建哪个子类实例),应优先在 __new__ 中决策,而不是在 __init__ 里绕弯
- 涉及 __slots__ 或自定义描述符时,务必确保 __init__ 中的赋值符合底层约束,否则可能静默失败










