《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 = None
def __new__(cls, *args, **kwargs):
if

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



