__new__ vs __init__ 区别详解
请详细说明Python中__new__和__init__的区别、调用顺序以及各自职责。何时必须重写__new__而非__init__?两者在元类中如何分工?给出不可变对象子类化和单例模式的示例说明它们的协作。
回答
Yahuda
__new__是真正创建实例的静态方法,__init__是初始化已创建实例的方法。
调用顺序:__new__ → __init__。只有__new__返回实例(且是该类实例)时,__init__才会自动被调用。
| 特性 | __new__ | __init__ |
|---|---|---|
| 职责 | 分配内存、创建实例 | 初始化实例属性 |
| 参数 | (cls, ...) | (self, ...) |
| 返回值 | 必须返回实例 | 必须返回None |
| 调用时机 | 类调用时最先执行 | __new__返回后才执行 |
必须重写__new__的场景:
- 继承不可变类型(如
int、str、tuple):__new__才有机会在对象创建前设置值 - 单例模式:控制实例创建
- 元类中创建类对象
# 单例
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance