__new__和__init__的区别?

本文解析了Python面向对象编程中__new__与__init__方法的区别及作用。__new__作为真正的构造函数负责创建实例对象,而__init__则用于初始化对象属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

init 方法为初始化方法, __new__方法才是真正的构造函数。
new__方法默认返回实例对象供__init__方法、实例方法使用。
init 方法为初始化方法,为类的实例提供一些属性或完成一些动作。
new 方法创建实例对象供__init
方法使用,__init__方法定制实例对象。
__new__是一个静态方法,而__init__是一个实例方法。
实例方法隐含的参数为类实例,而类方法隐含的参数为类本身。
静态方法无隐含参数,主要为了类实例也可以直接调用静态方法。

<think>嗯,用户问的是Python中__init____new__的区别。我得先回忆一下这两个方法的用途区别。首先,__new__是一个类方法,而__init__是一个实例方法。不过,可能用户不太清楚类方法实例方法的区别,需要解释清楚。 我记得__new__负责创建实例,也就是实际生成对象的过程,而__init__则是在实例被创建之后对其进行初始化。所以,__new__是在__init__之前被调用的。这点很重要,因为如果__new__返回的不是该类的实例,那么__init__就不会被调用。 接下来,我需要举例子说明。比如,单例模式通常会用__new__来确保只创建一个实例。这时候,重写__new__方法,判断是否已经存在实例,如果有就直接返回,没有的话才调用父类的__new__来创建。而__init__则是每次实例化时都会调用来初始化属性。 另外,参数方面,__new__的第一个参数是cls,代表类本身,而__init__的第一个参数是self,代表实例。__new__必须返回一个实例,否则后续的__init__不会执行。而__init__不需要返回任何东西,只是对实例进行设置。 可能用户还会混淆为什么有时候需要重写__new__。比如在继承不可变类型(如int、str)时,需要在__new__中修改参数,因为不可变类型的实例在创建后就不能修改,所以初始化必须在__new__阶段完成。 还有,错误处理方面,如果__new__没有正确返回实例,会导致问题。比如,如果忘记返回实例,__init__就不会执行,实例也不会被正确创建。 总结一下,两者的主要区别在于职责不同:__new__创建实例,__init__初始化实例。执行顺序上,__new__先于__init__。此外,参数返回值也不同,__new__需要返回实例,而__init__不需要。 需要确保解释清晰,避免术语过多,让用户能理解这两个方法在对象生命周期中的不同阶段的作用。可能还需要提到它们都是魔法方法,通常不需要直接调用,而是由Python解释器在实例化时自动调用。</think>在 Python 面向对象编程中,`__init__` `__new__` 是两个密切相关的魔法方法,它们的区别主要体现在以下 4 个方面: ```python class MyClass: # 构造函数(实际创建对象) def __new__(cls, *args, **kwargs): print("__new__ 被调用") instance = super().__new__(cls) # 必须返回实例 return instance # 初始化方法(配置已创建的对象) def __init__(self, value): print("__init__ 被调用") self.value = value # 不需要返回任何值 ``` **1. 职责差异** - `__new__`:实际创建并返回类的新实例(构造函数) - `__init__`:初始化已被创建的实例(初始化器) **2. 执行顺序** ```python obj = MyClass(10) # 输出顺序: # __new__ 被调用 # __init__ 被调用 ``` **3. 参数特征** ```python # __new__ 的第一个参数是类本身 (cls) # __init__ 的第一个参数是实例本身 (self) ``` **4. 返回值要求** - `__new__` 必须返回实例对象(否则不会执行 `__init__`) - `__init__` 禁止返回任何值(应该返回 `None`) **典型应用场景对比:** - `__new__` 的用途: - 实现单例模式(控制实例唯一性) - 继承不可变类型(如 `int`, `str`) - 元类编程中控制对象创建过程 - `__init__` 的用途: - 初始化实例属性 - 设置对象初始状态 - 验证初始化参数 **代码示例(单例模式实现):** ```python class Singleton: _instance = None def __new__(cls): if not cls._instance: cls._instance = super().__new__(cls) return cls._instance # 始终返回同一个实例 def __init__(self): print("初始化配置") # 每次实例化都会执行 a = Singleton() b = Singleton() print(a is b) # 输出 True ``` **关键记忆点:** - `__new__` 是类的「生育科医生」(负责诞生对象) - `__init__` 是「早教老师」(负责对象的基础培养) - 只有当 `__new__` 返回正确类型的实例时,`__init__` 才会执行 - 在大多数常规开发中,只需使用 `__init__` 即可满足需求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值