在 Python 中,__new__ 与 __init__ 这两个特殊方法各自承担什么职责?它们在调用时机、参数处理以及返回值方面存在哪些关键区别?
考察说明
考察对 Python 对象创建与初始化机制的理解,区分类的构造与初始化阶段。
回答思路
- 【回答框架 1】__new__ 是真正的构造方法,负责创建并返回类的新实例,在实例创建之前被调用,第一个参数是类本身,通常用于控制实例的创建过程,如实现单例模式或不可变对象。
- 【回答框架 2】__init__ 是初始化方法,在实例创建后被调用,用于设置实例属性,第一个参数是实例,不应返回任何值。
- 【回答框架 3】关键区别:__new__ 先于 __init__ 执行,且必须返回实例(通常是该类或其子类的实例),否则 __init__ 不会被调用;而 __init__ 返回 None。
- 【回答框架 4】实际使用中,大多数类只需定义 __init__,但若需定制不可变类型(如元组子类)或控制实例创建,则需重写 __new__,注意调用 super().__new__(cls) 并处理额外参数,避免重复初始化。
- 【关键点 1】__new__ 负责创建实例,返回新对象;__init__ 负责初始化已创建实例,返回 None。
- 【关键点 2】调用顺序固定:先 __new__ 后 __init__,且 __new__ 必须返回实例,否则 __init__ 不执行。
- 【关键点 3】__new__ 的第一个参数是类,__init__ 的第一个参数是实例;两者都能接收额外参数,但需保持兼容。
- 【易错点 1】误认为 __init__ 是构造方法,实际构造是 __new__。
- 【易错点 2】在 __init__ 中返回值会导致 TypeError,需注意。
- 【易错点 3】重写 __new__ 时未调用 super().__new__ 或返回错误类型,导致实例创建失败或 __init__ 不执行。