单例模式确保一个类全局唯一实例并提供统一访问点,常用实现有装饰器(简洁灵活)、__new__重写(最直观)、元类(框架级统一控制)和模块级(python特色、最轻量)。

什么是单例模式
单例模式确保一个类在整个程序运行期间只创建一个实例,并提供全局访问点。它常用于配置管理、日志记录、数据库连接池等需要统一状态的场景。
装饰器方式:简洁灵活,推荐日常使用
通过函数装饰器封装单例逻辑,不侵入原类定义,复用性强。
示例:
def singleton(cls):
instances = {}
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
<p>@singleton
class Config:
def <strong>init</strong>(self):
self.data = {}
优点:写法干净,支持任意类;注意:带参数的类初始化仅在首次调用时生效,后续忽略传参。
立即学习“Python免费学习笔记(深入)”;
__new__ 方法重写:控制实例创建过程,最常用
在类级别拦截对象构造,是 Python 实现单例最直观的方式。
示例:
class Logger:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().__new__(cls)
# 可在此处做一次初始化(如打开日志文件)
return cls._instance
关键点:必须返回 super().__new__(cls),不能直接调用 cls();风险:若子类未重写 __new__,可能破坏单例性。
元类方式:高度可控,适合框架级封装
通过自定义元类统一管理所有继承该元类的类的实例化行为。
示例:
class SingletonMeta(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
<p>class Database(metaclass=SingletonMeta):
def <strong>init</strong>(self):
self.connected = False
优势:自动作用于所有子类;适用场景:需对一批类统一施加单例约束,比如插件系统或配置基类。
模块级单例:Python 特色,最轻量可靠
利用 Python 模块只被导入一次的特性,把类实例直接定义在模块中。
example.py:
class _Config:
def __init__(self):
self.debug = True
<p>config = _Config() # 模块加载时即创建
其他文件中 from example import config 即可获得唯一实例。
特点:无并发问题、无需同步、启动快;局限:无法延迟初始化,也不支持带参构造。










