Python单例模式实现_多种写法对比

5次阅读

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

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 即可获得唯一实例。

特点 :无并发问题、无需同步、启动快; 局限:无法延迟初始化,也不支持带参构造。

text=ZqhQzanResources