《Python 对象创建的秘密:从 __new__ 到单例模式的实战演绎》
《Python 对象创建的秘密:从 new 到单例模式的实战演绎》
一、引言:对象是如何“诞生”的?
在 Python 的世界里,我们习惯于使用 __init__
来初始化对象,却常常忽略一个更底层的魔法方法——__new__
。它是对象真正的“创世者”,负责在内存中创建实例,而 __init__
则是“装饰者”,负责填充属性与行为。
这篇文章将带你深入理解 __new__
与 __init__
的分工与协作,并通过经典的单例模式(Singleton)实战案例,展示如何用 __new__
精准控制对象的创建过程。
二、背景介绍:Python 的对象模型与魔法方法
Python 是一门高度面向对象的语言,几乎所有东西都是对象。每当你创建一个类的实例时,Python 会先调用 __new__
方法创建对象,再调用 __init__
方法进行初始化。
这种双阶段机制赋予了开发者极大的灵活性,尤其在需要控制对象创建行为的场景中(如缓存、单例、元类等),__new__
成为不可或缺的利器。
三、基础知识:__new__
与 __init__
的区别与联系
__new__
的职责:
- 是一个静态方法(通常定义为
def __new__(cls, ...)
)。 - 接收类对象
cls
,返回一个实例。 - 是对象创建的起点,决定是否创建新对象。
__init__
的职责:
- 是一个实例方法(定义为
def __init__(self, ...)
)。 - 接收已创建好的实例
self
,进行属性赋值与初始化。 - 不返回值,仅用于配置对象状态。
调用流程图:
类名(...) → __new__(cls, ...) → 创建对象 → __init__(self, ...) → 初始化对象
四、实战案例:用 __new__
实现单例模式
单例模式是一种常见的设计模式,确保一个类只有一个实例,并提供全局访问点。
为什么用 __new__
?
因为我们要控制“是否创建新对象”,这正是 __new__
的职责。__init__
无法阻止对象的创建,只能在对象创建后进行初始化。
示例代码:单例模式实现
class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if