恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Python面向对象:单例模式的多种Python实现方式

  • 首页
  • 资讯中心
  • /
  • Python面向对象:单例模式的多种Python实现方式

相关资讯

终于微信也能接入OpenClaw了,附手把手教程和案例,感兴趣的可以看看 2026/10/2 23:16:16
Cursor 报错排查指南:用 TaoToken 统一 Key 打通 API 配置 2026/10/2 23:16:16
Codex Plugin 教程:Marketplace、Plugin、Skill 是如何被识别和加载的?TaoToken 统一 Key 通道配置解析 2026/10/2 23:16:16

最新资讯

apk-reverse的基准矩阵实录:13个公开目标如何推翻4条已记录结论
紧急!Capacitor框架9.6分高危漏洞曝光,localStorage与身份令牌恐被一键读取
Python协议级爬取Shopee商品数据实战
编译原理实验:递归下降分析器消除左递归与避坑指南
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成
《电磁兼容原理与技术》全套PPT课件2026

今日推荐

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成
编译原理实验:递归下降分析器消除左递归与避坑指南
Python协议级爬取Shopee商品数据实战

本周热门

从像素到笔画:srt-whiteboard-animation骨架笔迹追踪实现(Zhang-Suen细化+8邻接追踪)
网站建设的英语怎么说?别只背单词,看完这套安全完整流程才敢上线
新手入门看这篇:建设网站加盟避坑指南与SEO实操

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

Python面向对象:单例模式的多种Python实现方式

发布时间:2026/10/2 23:16:16
Python面向对象:单例模式的多种Python实现方式 一、开篇只能有一个实例的类单例模式Singleton是最常用的设计模式之一保证一个类只有一个实例并提供全局访问点。典型的场景包括数据库连接池、配置管理器、日志器、应用状态管理器。⌨️ 先看一个直观的需求# 问题全局配置应该只有一个实例# 如果每个模块都创建新的Config对象配置就会不一致# ❌ 多个实例——配置不一致# config1 AppConfig() # debugTrue# config2 AppConfig() # debugFalse —— 这是另一个配置了# ✅ 单例——只有一个实例# config1 AppConfig() # 创建实例# config2 AppConfig() # 返回同一个实例# config1 is config2 # True —— 同一个对象二、Python实现单例的四种方式2.1 使用__new__最常用classSingleton:单例——通过__new__控制实例创建_instanceNonedef__new__(cls,*args,**kwargs):ifcls._instanceisNone:cls._instancesuper().__new__(cls)cls._instance._initializedFalsereturncls._instancedef__init__(self,valueNone):# ⚠️ __init__每次都会调用需要防护ifself._initialized:returnself.valuevalue self._initializedTrue# 测试s1Singleton(第一次)s2Singleton(第二次)print(s1iss2)# True —— 同一个实例print(s1.value)# 第一次 —— __init__只执行了一次print(s2.value)# 第一次2.2 使用装饰器defsingleton(cls):单例装饰器——包装类instances{}defget_instance(*args,**kwargs):ifclsnotininstances:instances[cls]cls(*args,**kwargs)returninstances[cls]returnget_instancesingletonclassDatabase:数据库连接——单例def__init__(self,connection_stringdefault):self.connection_stringconnection_stringprint(f创建数据库连接:{connection_string})# 测试db1Database(mysql://localhost/mydb)db2Database(postgresql://localhost/testdb)print(db1isdb2)# Trueprint(db1.connection_string)# mysql://localhost/mydbprint(db2.connection_string)# mysql://localhost/mydb# ⚠️ 装饰器方式的缺点# Database现在是一个函数而不是类print(type(Database))# class function# isinstance检查不适用2.3 使用元类最彻底的实现classSingletonMeta(type):单例元类——自动让类成为单例_instances{}def__call__(cls,*args,**kwargs):ifclsnotincls._instances:cls._instances[cls]super().__call__(*args,**kwargs)returncls._instances[cls]classConfig(metaclassSingletonMeta):配置管理器——单例通过元类def__init__(self,debugFalse):# 不需要_initialized防护——元类控制__init__只调用一次self.debugdebug self.settings{}print(fConfig初始化: debug{debug})# 测试c1Config(debugTrue)c2Config(debugFalse)print(c1isc2)# Trueprint(c1.debug)# True —— 第一次初始化的值print(c2.debug)# True# 元类方式最优雅——类定义时就决定了单例行为# __init__自动只执行一次2.4 使用模块Pythonic方式# Python的模块本身就是单例# 模块在第一次导入时执行之后被缓存到sys.modules# 这是最Pythonic的单例实现方式# config.py class AppConfig: def __init__(self): self.debug False self.host localhost self.port 8080 def set_debug(self, enabled): self.debug enabled # 在模块级别创建实例——这就是单例 config AppConfig() # main.py # from config import config## # 所有地方导入的都是同一个config对象# config.set_debug(True)## # 另一个文件# from config import config# print(config.debug) # True —— 同一个对象# 优点简单、不需要任何特殊语法# 缺点导入时即创建不能延迟、无法传参构造三、单例的实战应用3.1 日志管理器importthreadingfromdatetimeimportdatetimeclassLogger(metaclassSingletonMeta):日志管理器——全局唯一def__init__(self):self._lockthreading.Lock()self._handlers[]self._levelINFOdefset_level(self,level):self._levelleveldefadd_handler(self,handler):self._handlers.append(handler)deflog(self,message,levelINFO):线程安全的日志记录withself._lock:timestampdatetime.now().strftime(%Y-%m-%d %H:%M:%S.%f)[:-3]log_entryf[{timestamp}] [{level}]{message}# 输出到所有处理器forhandlerinself._handlers:handler(log_entry)# 默认输出到控制台ifnotself._handlers:print(log_entry)# 使用——在任何地方获取同一个Loggerdefsome_function():loggerLogger()logger.log(函数执行中...)defanother_function():loggerLogger()logger.log(另一个函数执行中...,levelWARNING)some_function()another_function()3.2 数据库连接池fromthreadingimportLockclassConnectionPool(metaclassSingletonMeta):数据库连接池——全局唯一def__init__(self,max_connections10):self.max_connectionsmax_connections self._connections[]self._in_useset()self._lockLock()print(f连接池创建: 最大{max_connections}个连接)defget_connection(self):获取一个连接withself._lock:iflen(self._connections)self.max_connections:connf连接-{len(self._connections)1}self._connections.append(conn)else:raiseRuntimeError(连接池已满)self._in_use.add(conn)returnconndefrelease_connection(self,conn):释放连接withself._lock:self._in_use.discard(conn)defstatus(self):return{total:len(self._connections),in_use:len(self._in_use),available:len(self._connections)-len(self._in_use),}# 使用poolConnectionPool(max_connections5)conn1pool.get_connection()conn2pool.get_connection()print(pool.status())# {total: 2, in_use: 2, available: 0}pool.release_connection(conn1)print(pool.status())# {total: 2, in_use: 1, available: 1}四、总结单例模式保证只有一个实例。Python提供了多种实现——从简单的模块到彻底的元类。四种实现对比方式优点缺点__new__简单直观需要防__init__重复装饰器简洁类型变成函数元类最彻底稍复杂模块最Pythonic不能延迟创建✅日常推荐模块级别实例最简单→__new__方式需要传参→ 元类框架/库。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号