Python类实例化过程_new与init区别

7次阅读

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

Python类实例化过程_new与init区别

__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 = value

d = Demo(42)

输出:

new called

init called

text=ZqhQzanResources