python new 和 init 的区别

Python__new____init__ 的区别

python new 和 init 的区别

在 Python 中,__new____init__ 是两个密切相关的特殊方法,对于理解和创建自定义类至关重要。虽然这两个方法都参与了对象的创建,但它们在作用和执行时机上却存在着显著差异。

__new__

__new__ 是一个类方法,负责 创建 一个新对象。它接收一组参数,并返回一个新对象的引用。__new__ 方法通常在子类中被重写,以自定义对象的创建过程。

用法:

python
class MyClass:
def __new__(cls, *args, **kwargs):
# 自定义对象创建逻辑
# ...
return super().__new__(cls, *args, **kwargs)

__init__

另一方面,__init__ 是一个实例方法,用于 初始化 新创建的对象。它接收创建新对象时传递给 __new__ 的相同参数。__init__ 方法负责将属性值分配给对象。

用法:

python
class MyClass:
def __init__(self, *args, **kwargs):
# 初始化对象属性
# ...

差异

| 特征 | __new__ | __init__ |
|—|—|—|
| 类型 | 类方法 | 实例方法 |
| 时机 | 对象创建之前 | 对象创建之后 |
| 作用 | 创建对象 | 初始化对象 |
| 参数 | 类和构造函数参数 | 对象参数 |
| 返回值 | 对象引用 | 无 |
| 重写 | 子类中重写 | 无需重写 |

何时使用 __new____init__

一般来说,__new__ 用于以下情况:

  • 控制新对象的创建过程。
  • 创建不可变对象。
  • 实现单例模式。

__init__ 用于以下情况:

  • 初始化对象属性。
  • 执行其他自定义初始化操作。
  • 为对象分配默认值。

代码示例

下面是一个演示 __new____init__ 差异的示例:

“`python
class Person:
def new(cls):
print(“创建新对象”)
return super().new(cls)

def __init__(self, name, age):
    print("初始化对象")
    self.name = name
    self.age = age

p = Person(“John”, 30)
“`

输出:


创建新对象
初始化对象

常见问答

1. 对象创建的完整过程是什么?

对象创建分两个阶段进行:首先调用 __new__ 创建新对象,然后调用 __init__ 初始化对象。

2. 为什么 __new__ 返回一个对象引用?

它返回对象引用以允许子类自定义对象的创建过程,例如创建一个不可变的对象。

3. __new____init__ 可以同时被重写吗?

是的,可以同时重写这两个方法,但需要注意,__new__ 必须返回对象引用以供 __init__ 使用。

4. __init__ 可以多次调用吗?

否,__init__ 只会在对象第一次创建时调用一次。

5. 重写 __new__ 时需要考虑什么?

重写 __new__ 需要确保它返回一个有效的对象,并正确处理对象的初始化。它还可能影响对象创建的性能,因此应谨慎使用。

原创文章,作者:王利头,如若转载,请注明出处:https://www.wanglitou.cn/article_10353.html

(0)
打赏 微信扫一扫 微信扫一扫
王利头王利头
上一篇 2024-03-26 12:28
下一篇 2024-03-26 12:34

相关推荐

公众号