2025-08-27?
这啥玩意儿?
我感觉我看了 AI 的讲解,也没有发现在哪里会产生使用 new 的需求
在 Python 中,__new__ 和 __init__ 都是类的特殊方法(也叫魔术方法),它们在对象创建过程中扮演不同的角色。理解它们的区别对于深入掌握 Python 面向对象编程非常重要。
一、基本职责的区别
| 方法 | 作用 |
|---|---|
__new__ |
创建对象(实例化),返回一个实例对象 |
__init__ |
初始化对象,对已创建的对象设置初始状态(属性等) |
二、执行顺序
__new__先执行:负责创建对象(即分配内存)。__init__后执行:负责初始化对象(设置属性等)。
class MyClass:
def __new__(cls, *args, **kwargs):
print("__new__ is called")
instance = super().__new__(cls)
print("Object created")
return instance
def __init__(self, value):
print("__init__ is called")
self.value = value
obj = MyClass(10)
输出:
__new__ is called
Object created
__init__ is called
三、参数传递
__new__的第一个参数是cls(类本身),返回一个实例。__init__的第一个参数是self(实例),不返回值(或返回None)。
def __new__(cls, *args, **kwargs):
# 创建实例
return super().__new__(cls)
def __init__(self, value):
# 初始化实例
self.value = value
四、返回值的区别
| 方法 | 返回值 |
|---|---|
__new__ |
必须返回一个实例对象(通常是 cls 的实例) |
__init__ |
不应返回值,或只能返回 None,否则会报错 |
⚠️ 如果
__init__返回非None值,会引发TypeError。
五、典型使用场景
1. __new__ 的使用场景(较少见,但关键)
- 不可变对象的初始化(如
int,str,tuple) - 单例模式(Singleton)
- 自定义对象创建过程(比如从缓存返回对象)
✅ 示例:实现单例模式
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self):
# 多次调用 __init__,但 __new__ 只创建一次对象
print("Initializing singleton")
a = Singleton()
b = Singleton()
print(a is b) # True
注意:虽然
__init__每次都会执行,但__new__控制了对象是否真正创建。
2. __init__ 的使用场景(最常见)
- 给对象设置初始属性
- 执行初始化逻辑
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
六、关键总结
| 对比项 | __new__ |
__init__ |
|---|---|---|
| 作用 | 创建对象 | 初始化对象 |
| 调用时机 | 在 __init__ 之前 |
在 __new__ 之后 |
| 参数 | cls |
self |
| 返回值 | 必须返回实例 | 不应返回值(或返回 None) |
| 是否必须 | 否(一般用默认) | 是(常用) |
| 使用频率 | 低(特殊场景) | 高(几乎每个类都有) |
| 可否被覆盖 | 可以 | 可以 |
七、补充说明
- 如果
__new__返回None,则__init__不会被调用。 - 如果
__new__返回的不是当前类的实例,__init__也不会被调用(或调用在错误的对象上)。 __new__是静态方法(但不需要@staticmethod装饰),Python 自动处理。__init__是实例方法,依赖于__new__返回的实例。
八、一句话总结
__new__决定 如何创建对象,__init__决定 如何初始化对象。
你可以把 __new__ 看作“工厂”,负责造出一个空壳对象;__init__ 是“装修工”,负责给这个空壳添加属性和配置。

浙公网安备 33010602011771号