new 是 python 中负责创建实例对象的静态方法,它在 init 之前被调用,用于分配内存并返回实例,决定对象“从哪来”;若不返回本类实例,则 init 可能被跳过。

__new__ 是 Python 中真正负责创建实例对象的静态方法,它在 __init__ 之前被调用,控制对象的生成过程。理解它,等于看清了 Python 对象诞生的第一步。
__new__ 的核心作用:分配内存并返回实例
Python 中,对象创建分两步:先分配内存(生成空对象),再初始化属性。__new__ 就是完成第一步的关键——它接收类本身作为第一个参数(cls),可选地接收后续传给构造函数的参数,必须返回一个该类的实例(通常是调用 super().__new__(cls) 得到)。如果它不返回实例,__init__ 将不会被调用。
- __new__ 是静态方法(即使没加 @staticmethod,解释器也会当静态方法处理)
- 它决定“要不要创建这个对象”,甚至可以返回其他类的实例或缓存对象
- 返回的对象类型若与当前类不一致,__init__ 仍可能被跳过(取决于返回对象的类型是否匹配)
__new__ 和 __init__ 的执行顺序与分工
典型流程:MyClass(...) → 触发 MyClass.__new__(MyClass, ...) → 返回实例 → 再调用 该实例.__init__(...)。
- __new__ 关注“从哪来”:内存怎么分配、返回谁(本类?子类?已有对象?)
- __init__ 关注“变成什么样”:只负责设置属性,不返回值(返回值会被忽略)
- 如果 __new__ 返回的是 MyClass 的实例,__init__ 自动被调用;如果返回的是其他类的实例,且该类有 __init__,则调用那个类的 __init__
常见实用场景
__new__ 不常重写,但一旦需要底层控制,就不可替代:
这本书给出了一份关于python这门优美语言的精要的参考。作者通过一个完整而清晰的入门指引将你带入python的乐园,随后在语法、类型和对象、运算符与表达式、控制流函数与函数编程、类及面向对象编程、模块和包、输入输出、执行环境等多方面给出了详尽的讲解。如果你想加入 python的世界,David M beazley的这本书可不要错过哦。 (封面是最新英文版的,中文版貌似只译到第二版)
立即学习“Python免费学习笔记(深入)”;
- 单例模式:检查类是否已有实例,有则直接返回,避免重复创建
- 不可变对象定制:如自定义元组子类,在 __new__ 中预处理数据并传给父类 __new__
- 对象池/复用控制:限制某类最多存在 N 个实例,超出时复用旧对象
- 根据参数动态返回不同类的实例:例如 JSON 解析中,根据 type 字段返回 User 或 Order 实例
一个单例的简洁示例
```python
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self):
if not hasattr(self, 'inited'): # 防止多次初始化
self.inited = True
print("initialized")
```
注意:__init__ 里加标记位,是因为 __new__ 返回已有实例时,__init__ 仍会被调用——这是易错点。








