news 2026/7/14 18:41:08

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在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))

基本的用法就是这些了。

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

2025轻松指南:零基础医疗会议转待办,包教包会避坑干货满满

说真的,我之前一直觉得医疗会议记录是个“无解难题”—直到上个月帮心内科的张姐试了听脑,才发现原来能这么轻松!张姐跟我吐槽了大半年:科室每周两次病例讨论会,每次都要一边听主任分析病情,一边飞快记笔记…

作者头像 李华
网站建设 2026/7/14 13:16:24

论范式转移中的组织认知坍塌与动态评价体系的重构:从“柯达死链”到“用现在质疑过去”的演进逻辑

论范式转移中的组织认知坍塌与动态评价体系的重构:从“柯达死链”到“用现在质疑过去”的演进逻辑摘要: 在本轮以人工智能大模型、具身智能、量子计算及半导体公理跃迁为代表的破坏性创新浪潮中,传统科层制巨头频繁陷入一种群体性的“内源性中…

作者头像 李华
网站建设 2026/7/14 7:35:37

Agent 上下文管理深度解析

Claude Code 拥有 1M token 的超大上下文窗口,但生产环境数据显示:约 18% 的会话仍然触发压缩机制,平均每会话压缩 6.7 次。更大的窗口只是"推迟"了问题,并没有"解决"问题。当 Agent 从单次对话走向持续运转&…

作者头像 李华
网站建设 2026/7/14 18:36:37

LLM、Token、RAG、MCP……这10个AI名词,一张图给你讲明白

AI入门科普 第1篇LLM、Token、RAG、MCP……这10个AI名词,一张图给你讲明白程序猿Joe 2026-06-29大家好,我是程序猿Joe。 前两天有个读者私信我:“Joe哥,我看AI文章的时候,满屏都是 LLM、Token、Prompt、RAG、MCP、Ag…

作者头像 李华