
Python 允许类不显式定义 __new__ 方法,是因为它默认继承自 object 的 __new__ 已能完成对象内存分配;而 __init__ 虽非语法强制,但作为实例初始化的唯一标准入口,实践中不可或缺。
python 允许类不显式定义 `__new__` 方法,是因为它默认继承自 `object` 的 `__new__` 已能完成对象内存分配;而 `__init__` 虽非语法强制,但作为实例初始化的唯一标准入口,实践中不可或缺。
在 Python 的对象创建流程中,__new__ 与 __init__ 承担截然不同的职责,二者协同工作但不可相互替代:
- __new__ 是静态方法,负责分配内存并返回新实例(即“构造对象”),其返回值必须是该类或其子类的实例;
- __init__ 是实例方法,在 __new__ 返回实例后被调用,负责初始化实例状态(如设置属性、执行配置逻辑)。
关键在于:即使你未在类中定义 __new__,Python 仍会自动调用父类(通常是 object)的 __new__ 方法。例如:
class A:
def __init__(self):
print("hello world")
a = A() # 输出: hello world这段代码实际执行流程为:
- A() 触发 A.__new__(A) → 因未重写,调用 object.__new__(A),分配内存并返回空实例;
- 若 __new__ 返回的是 A 类型实例,则自动调用 a.__init__();
- __init__ 执行初始化逻辑(此处打印字符串)。
⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- __new__ 必须显式返回一个实例(通常为 super().__new__(cls)),否则 __init__ 不会被调用;
- __init__ 没有返回值(或隐式返回 None),若返回非 None 值将触发 TypeError;
- 仅当需要控制对象创建过程时(如单例模式、不可变类型、对象池、类型转换等),才需重写 __new__;日常开发中绝大多数场景只需实现 __init__。
简言之:__new__ 解决“如何造出一个对象”,__init__ 解决“如何装点这个对象”。前者由系统兜底提供,后者由开发者主导定制——这正是 Python 在灵活性与实用性之间所做的精巧平衡。


















