news 2026/5/1 9:38:51

Python 单例模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 单例模式

Python 中的单例模式(Singleton Pattern)

单例模式是一种创建型设计模式,其核心目的是:确保一个类全局只有一个实例,并提供一个全局访问点来获取该实例

常见应用场景:

  • 数据库连接池
  • 日志器(Logger)
  • 配置管理器(Config Manager)
  • 线程池
  • 缓存对象
单例模式的优点
  • 节省资源(只创建一次)
  • 全局统一访问
  • 控制实例数量
缺点
  • 难以单元测试(全局状态)
  • 可能隐藏依赖关系
  • 在多线程环境下需小心实现
Python 中实现单例模式的几种常见方式

Python 是动态语言,实现单例非常灵活。下面从简单到推荐依次介绍。

1. 使用模块级变量(最 Pythonic,最推荐!)

Python 模块本身就是天然的单例,所有导入模块的代码共享同一个实例。

# singleton.pyclass_Singleton:def__init__(self):print("Singleton created")defdo_something(self):print("Doing something...")instance=_Singleton()# 模块级实例,只创建一次# 在其他文件中使用# from singleton import instancefromsingletonimportinstanceprint(instance)# 同一个对象instance.do_something()

优点:简单、无需额外代码、线程安全、天生单例
这是大多数 Python 项目中实际使用的“单例”方式

2. 使用__new__方法重写(经典方式)
classSingleton:_instance=Nonedef__new__(cls,*args,**kwargs):ifcls._instanceisNone:cls._instance=super().__new__(cls)returncls._instancedef__init__(self):# 注意:__init__ 可能会被调用多次!# 如果需要初始化逻辑,要防止重复执行ifnothasattr(self,'_initialized'):print("Initializing singleton...")self._initialized=True# 测试s1=Singleton()s2=Singleton()print(s1iss2)# Trueprint(id(s1),id(s2))# 相同地址

注意__init__会被调用多次(每次实例化时),所以初始化逻辑要加保护。

3. 使用装饰器实现
defsingleton(cls):instances={}defget_instance(*args,**kwargs):ifclsnotininstances:instances[cls]=cls(*args,**kwargs)returninstances[cls]returnget_instance@singletonclassMyClass:def__init__(self,value):self.value=value# 使用a=MyClass(10)b=MyClass(20)print(aisb)# Trueprint(a.value)# 10(第一次传入的值生效,后续忽略)
4. 使用元类(Metaclass)实现(高级方式)
classSingletonMeta(type):_instances={}def__call__(cls,*args,**kwargs):ifclsnotincls._instances:instance=super().__call__(*args,**kwargs)cls._instances[cls]=instancereturncls._instances[cls]classDatabaseConnection(metaclass=SingletonMeta):def__init__(self):print("Connecting to database...")# 使用db1=DatabaseConnection()db2=DatabaseConnection()print(db1isdb2)# True
5. 线程安全的单例(使用锁)

如果在多线程环境中使用__new__方式,建议加锁避免竞争:

importthreadingclassThreadSafeSingleton:_instance=None_lock=threading.Lock()def__new__(cls,*args,**kwargs):ifcls._instanceisNone:withcls._lock:# 双重检查(Double-Checked Locking)ifcls._instanceisNone:cls._instance=super().__new__(cls)returncls._instance
推荐总结
方式推荐度线程安全简洁性说明
模块导入★★★★★最高最 Pythonic,强烈推荐
__new__重写★★★★需加锁经典方式
装饰器★★★灵活但参数会被忽略
元类★★强大但复杂
threading.Lock★★★多线程必备
实际建议
  • 99% 的场景下,使用模块级单例就够了,不要过度设计。
  • 如果你真的需要一个“类”的单例行为,使用__new__或元类。
  • 避免在单例中持有可变全局状态(容易导致 bug)。

如果你想看单例在实际项目中的应用(如日志器、配置中心),或者结合其他模式(如工厂+单例),可以告诉我!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 9:33:44

Dify在法律文书生成中的格式规范性保障

Dify在法律文书生成中的格式规范性保障 在律师事务所的日常工作中,一份起诉状可能因为标题层级错位、引用法条过时或缺少关键段落而被法院退回;一份合同因金额书写格式不统一、签名位置缺失而在商务谈判中显得不够专业。这些看似“细节”的问题&#xff…

作者头像 李华
网站建设 2026/4/30 22:46:44

openmv与stm32通信实时性分析:STM32F4性能测试报告

OpenMV与STM32通信实时性实测:如何榨干STM32F4的串口性能?你有没有遇到过这种情况——OpenMV明明“咔嚓”一下就识别出了目标,但你的小车却慢半拍地转向?或者AGV在避障时突然抖了一下,像是卡顿了一帧视觉?别…

作者头像 李华
网站建设 2026/5/1 9:29:15

Dify平台的会话上下文长度管理策略

Dify平台的会话上下文长度管理策略 在构建智能客服、AI助手或内容生成系统时,你是否曾遇到这样的尴尬:用户刚聊到第三轮,AI突然“失忆”,忘了之前说好的角色设定;或者更糟——请求直接报错,提示“上下文过长…

作者头像 李华
网站建设 2026/4/30 5:33:18

Open-AutoGLM性能提升5倍的秘密:动态图学习机制深度剖析

第一章:Open-AutoGLM性能提升5倍的秘密:动态图学习机制深度剖析Open-AutoGLM 在图神经网络(GNN)领域实现了高达5倍的性能提升,其核心突破在于引入了创新的动态图学习机制。该机制不再依赖静态图结构,而是根…

作者头像 李华
网站建设 2026/4/17 9:02:34

图文转Word自动化文档生成终极指南:一键生成,效率翻倍

还在为图文排版抓狂吗?会议记录、产品说明、培训材料...每次都要花几个小时复制粘贴、调整格式?今天我要为你分享一个3分钟搞定图文转Word的方法,让你彻底告别手动排版的烦恼! 【免费下载链接】Awesome-Dify-Workflow 分享一些好用…

作者头像 李华
网站建设 2026/4/17 13:04:07

IDM激活脚本完整使用指南:三步实现永久试用期锁定

IDM激活脚本完整使用指南:三步实现永久试用期锁定 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager试用期到期而烦恼…

作者头像 李华