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