当前位置: 首页 > 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 singletontea = singleton('my_project.main.coffee', 'tea')

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

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

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

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

from any_singleton import singleton_valueclass Tea:passtea = 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))

基本的用法就是这些了。

更多内容可以去查看我已经在PyPI上发布的any-singleton。

http://www.jsqmd.com/news/438110/

相关文章:

  • 2026年3月青岛控制度数眼镜品牌推荐,专业验光与品牌保障口碑之选 - 品牌鉴赏师
  • 豆包上怎么出现自己的公司?揭秘 AI 时代的 GEO 获客新方案 - 品牌2026
  • PbootCMS网站常见站点信息标签 适用范围:全站任意地方均可使用
  • 山东一卡通回收攻略:团团收让您的闲置卡秒变收益 - 团团收购物卡回收
  • 选择团团收,让山东一卡通回收更专业、更安心 - 团团收购物卡回收
  • 网站后台登录提示:”登录失败:数据库目录写入权限不足!“-PbootCMS网站常见报错
  • 这次终于选对的一键生成论文工具,千笔写作工具 VS 学术猹,专为研究生量身打造!
  • 2026年3月德州扑克教学培训班推荐,专业教学与口碑保障之选 - 品牌鉴赏师
  • 专业医院成本核算管理系统厂商与综合 HIS 厂商发展路径探析 - 业财科技
  • BIO详解:解锁阻塞IO的使用方式
  • 基础入门-web应用 架构搭建 漏洞 http数据包
  • 2026年3月随身WiFi品牌权威推荐,技术实力与市场口碑深度解析 - 品牌鉴赏师
  • 2026年3月天津短视频平台推广公司最新推荐,聚焦多平台分发与流量放大 - 品牌鉴赏师
  • 豆包可以做广告吗?如何通过 AI 搜索实现精准获客? - 品牌2026
  • discuz模板目录/template/default 官方默认全局模板
  • DedeCMS列表标签 list 获取列表模板中的列表内容
  • 网站是什么?什么是网站?
  • DedeCMS全局标签arclist
  • AI能打广告吗?哪家公司可以做? - 品牌2026
  • Java 方法详解
  • 网站安装过程中出现红色叉号怎么办?
  • AI广告投放方案,通过豆包做推广的路径 - 品牌2026
  • 2026年3月自动送料机厂家权威推荐,技术实力与市场口碑深度解析 - 品牌鉴赏师
  • 网站安装过程中一直提示数据库连接失败怎么办?
  • DedeCMS模板目录:织梦cms网站模板在哪里修改
  • 2026年质量好的准分子UV系统公司推荐:氮气保护UV系统优质供应商推荐 - 品牌宣传支持者
  • 2026年质量好的工程灯品牌推荐:酒店工程灯/会所工程灯厂家热销推荐 - 品牌宣传支持者
  • ThreadLocalMap 和 HashMap 的区别?
  • P5221 Product 另解
  • AI能做企业广告吗?如何做?有可行的AI广告方案吗? - 品牌2026