New 和 init 分别负责什么?
new 和 init 的分工一句话就能讲清:
-
new:负责造对象(分配空间、返回实例)。 -
init:负责装修对象(给实例绑属性、设初值)。
🧱 创建流程¶

用图表示就是:
MyClass(1,2)
│
▼
__new__(cls, 1, 2) → 创建并返回 self (一片刚申请的内存)
│
▼
__init__(self, 1, 2) → 给 self 挂上各种属性,准备就绪
│
▼
返回 self 给你
⚖️ 关键区别¶
| new | init |
|---|---|
| 静态方法 / 类方法 | 实例方法 |
| 必须有返回值(返回实例) | 必须返回 None |
| 在对象创建之前执行 | 在对象创建之后执行 |
| 常用于控制是否创建实例、单例、不可变类型 | 常用于设置实例的初始状态 |
🧪 什么时候必须动 new¶
-
单例模式 —— 在
new里判断类是否已有实例,有就直接返回,不另创建。 -
继承不可变类型(
int,str,tuple)—— 因为它们的值在创建时就得确定,init根本改不了。只能在new里传值。 -
元类里定制类的创建 —— 元类的
new是在控制类对象如何出生,和这里的逻辑同理,只是层级更高。
🔧 一个单例的极简例子¶
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self):
print("init called") # 每次 Singleton() 都会执行,但对象还是同一个
所以,我常用“造房子”来记:new 是打地基、浇筑结构,init 是内部装修、布置家具。地基打不好房子根本不存在,装修不弄则没法住人。面试时把这条线捋清,接着再谈单例、不可变类型,就是水到渠成的事了。