Python中__init__和__new__有什么区别?

__new__在对象实例化前调用,负责创建对象,而__init__在对象创建后调用,用于初始化对象属性。通常只重写__init__进行对象初始化,__new__的修改需求较少。

  __init__和__new__二者均是Python面向对象语言中的函数,其中__new__使用频率较少,__init__则使用的频率较多,那么Python中__init__和__new__的区别是什么?具体请看以下内容介绍。

  在Python中,__init__和__new__是两个特殊的方法,用于对象的创建和初始化过程。它们的作用和执行时有所不同:

  1、__new__

  __new__是一个用于创建对象的特殊方法,是在对象实例化之前调用的。

  __new__方法负责创建对象,并返回一个新的对象实例。

  __new__方法是一个类方法,必须返回一个新的对象实例。

  可以通过重写__new__方法来控制对象的创建过程,例如自定义对象的创建逻辑、返回其他类型的实例等。

  2、__init__

  __init__是一个用于对象初始化的特殊方法,是在对象实例化之后调用的。

  __init__方法接收新创建的对象实例作为其第一个参数,并在该方法内部对对象的属性进行初始化。

  __init__方法通常用于设置对象的初始状态,对属性进行赋值等操作。

  __init__方法不需要返回任何内容,它的主要目的是对对象进行初始化。

  总结:

  __new__是在对象实例化之前调用,用于创建对象实例;

  __init__是在对象实例化之后调用,用于初始化对象的属性。

  在实际使用中,通常情况下我们只需要重写__init__方法来实现对象的初始化,而对__new__方法进行修改的需求相对较少。

### `__new__` `__init__` 的区别 #### 作用与职责 `__new__` 是一个静态方法,负责创建类的实例对象。它在对象实例化过程中首先被调用,并返回一个实例。如果返回的不是当前类的实例,则不会调用 `__init__`[^4]。 `__init__` 是一个实例方法,用于初始化已被创建的对象实例。它在 `__new__` 返回实例后自动调用,通常用于设置对象的属性或执行初始化逻辑[^1]。 #### 调用顺序 `__new__` 在对象创建之前被调用,而 `__init__` 在对象创建之后被调用。两者的协作流程如下: 1. 当使用 `ClassName()` 实例化对象时,首先调用 `__new__` 创建实例。 2. 如果 `__new__` 返回的是当前类的实例,则继续调用 `__init__` 对该实例进行初始化[^3]。 #### 参数返回值 `__new__` 接收的第一个参数是类本身(`cls`),随后可以接收任意数量的位置参数关键字参数。它必须返回一个实例对象,通常是当前类的实例[^4]。 `__init__` 接收的第一个参数是实例对象(`self`),随后是与 `__new__` 相同的参数列表。它不返回任何值,若尝试返回非 `None` 值将引发异常[^4]。 #### 使用场景 `__new__` 通常用于需要控制对象创建过程的场景,例如单例模式、不可变类型子类化、对象池或缓存等[^4]。以下是一个实现单例模式的示例: ```python class Singleton: _instance = None def __new__(cls): if not cls._instance: cls._instance = super().__new__(cls) return cls._instance ``` `__init__` 更为常见,适用于大多数对象初始化需求,如设置属性、配置初始状态等。例如: ```python class Person: def __init__(self, name, age): self.name = name self.age = age ``` #### 注意事项 除非有特殊需求,否则应优先使用 `__init__`。重写 `__new__` 可能会影响对象创建的核心机制,容易引入难以调试的问题,因此需谨慎使用[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值