当前位置: 首页 > news >正文

在Python中用any-singleton实现单例模式单例模式

我个人常用类似以下的代码来实现单例模式:

GLOBAL_KEY = '_my_coffee' if GLOBAL_KEY not in globals(): # 初始化: globals()[GLOBAL_KEY] = { 'cup_of': 'tea' } coff = globals()[GLOBAL_KEY] print(coff['cup_of']) # Output: tea

上面的coff就是一个单例,全局仅会初始化一次,并总是同一个对象。

至于其他的实现方法,这里不多做赘述。大家可以去看看站内的:Python中的单例模式的几种实现方式的及优化

Any-singleton

大部分情况下,单例模式可以很容易得被实现,并且正确运行。但总是要写一小段代码来实现,就不那么方便,也不易于管理。
为此,我就做了个简易的单例模式工具库——Any-singleton。

Any-singleton提供了两大功能:“创建单例”和“使函数仅运行一次”。

创建单例

我们仅需要调用singleton()并传入一个“唯一域名”和一个用于初始化的值,就可以很快的创建一个单例对象:

from any_singleton import singleton tea = singleton('my_project.main.coffee', 'tea')

当然,也可以不直接给一个值,而是利用singleton()实例化一个对象作为单例的初始值:

from any_singleton import singleton my_range = singleton('my_project.main.coffee', range, 123)

当第二个参数为一个type时,singleton()不会把该参数直接作为初始值,而是将其结合后面的参数实例化再作为初始值。
该单例的实例化过程在整个程序的生命周期将只会执行一次。

为了消除歧义,你还可以使用singleton_value()来替代singleton(),使之无论第二个参数是不是type类型的,都直接将其直接作为初始值使用:

from any_singleton import singleton_value class Tea: pass tea = singleton_value('my_project.main.coffee', type(Tea))

使函数仅运行一次

使用@once()装饰器来创建一个在整个程序生命周期里只会被调用一次的函数:

import tomllib from any_singleton import once, singleton @once('my_project.initializations.init') def init(config_path: str) -> None: with open(config_path, 'rb') as f: config = singleton('my_project.globals.config', tomllib.load(f)) init('config.toml')

或者使用@run_once()装饰器来创建一个被@once()装饰的函数,并立即自动调用一次。

import tomllib from any_singleton import run_once, singleton @run_once( 'my_project.initializations.init', second_calling = SecondCallingBehaviour.NoneToReturn, # 以下的参数将传递给被装饰的`init()`。 'config.toml' ) def init(config_path: str) -> None: with open(config_path, 'rb') as f: config = singleton('my_project.globals.config', tomllib.load(f))

基本的用法就是这些了。

http://www.cnnetsun.cn/news/3055388.html

相关文章:

  • 2025轻松指南:零基础医疗会议转待办,包教包会避坑干货满满
  • 论范式转移中的组织认知坍塌与动态评价体系的重构:从“柯达死链”到“用现在质疑过去”的演进逻辑
  • 安心存取,轻松分享!一款基于 CloudFlare 的开源文件托管工具!
  • Agent 上下文管理深度解析
  • Madgicx 好用吗?当预算跨了三个平台,你需要的可能不是另一个优化器
  • LLM、Token、RAG、MCP……这10个AI名词,一张图给你讲明白
  • TPIC7710评估板实战指南:从硬件连接到电机控制与故障诊断
  • 从零到一:用nssm将任意应用封装为Windows服务
  • 实战!LangGraph Multi-Agent Supervisor 模式:手把手构建生产级多智能体系统
  • 用Rust给Python写一个高性能扩展模块(PyO3实战)
  • XCP协议:从总线标定到汽车ECU数据交互的核心
  • HarmonyOS APP《画伴梦工厂》开发第9篇:相机开发实战——调用系统相机拍照
  • 税务申报工具:税法规则与自动计算的系统
  • HarmonyOS APP《画伴梦工厂》开发第10篇:相册选择与 PhotoViewPicker——从相册导入图片
  • Java的java.lang.foreign.MemorySegment内存访问模式与缓存友好性优化
  • AI之长效智能体Hermes Agent
  • 实时更新策略
  • BufferedInputStream 源码——带有缓冲区的装饰器类 BufferedInputStream.class 的UML关系图,如下所示:
  • 现存coding plan /token plan推荐
  • LockSupport简介
  • 基于超混沌系统和SHA-256算法的图像加密算法研究算法matlab实现
  • 数学建模一键生成所有图片的实验代码
  • 【滤波】基于平方根无迹卡尔曼滤波SR-UKF实现信号去噪附matlab代码
  • 无特征0day穿透边界防护未触发任何告警 全量行为建模如何4小时锁死全链路影响范围
  • 氢燃料电池(PEMFC)系统仿真建模+空压机、阴极、阳极、电堆模型Matlab仿真
  • AI 前沿速报 | 2026年第27周(6月22日 — 6月28日)
  • 实战指南 | 基于STM32F407 - 利用STM32CubeProgrammer的USB DFU实现无硬件Boot引脚固件升级
  • 高通正面挑战英伟达、华为腾讯百度抢机器人大脑、A股反弹
  • Adobe Illustrator脚本革命:Fillinger智能填充工具的终极指南
  • 意式轻奢高定木作盘点:图森、M77 之外的高性价比之选