python单例模式的使用

之前写过这样的一篇文章:腾讯云COS的快速接入,里边讲到了我对于cosutil这个类初始化的时候的一点改造。但是我发现了一个问题:我的接口每次去请求的时候都要初始化一次,因为我的接口是这样定义的:

python 复制代码
@router.post('/upload/{cos}')
async def upload_file(cos:str, file: UploadFile = File(...)):
    if cos and cos == 'cos':
        cosUtil = COSUtil()
        return await cosUtil.upload_file_from_form(file)

这样每次都得去读取配置文件,然后初始化对象,显得不是很友好,那有没有方式优化一下呢?本着代码要往优雅的地步优化,我开始了倒腾。最后的解决方案是:单例模式生成cosUtil

部分的教程是建议全局声明:cosUtil = cosUtil() 但是作为java程序员,还是喜欢哪里使用,哪里初始化,就算哪里有问题,也就影响一个小模块。顺便学习一下python的单例模式,加深对于python的理解。

好的,话不多说,直接上代码:

在代码的1-5行,我定义了一个Singleton这个类,实现单例模式,我自己的COSUtil只需要继承这个Singleton即可。当然代码里我写了一些日志测试一下:

通过日志可以明显的看出来:在第一次初始化之后,后期拿到的都是同一个对象,免去了初始化的操作,输出的对象的id也是一致的。这就很好的提升了程序的性能问题。话不多说,先把代码部署上去。

为了更好的验证这个效果,其实shigen在解决这个问题之前,写了一个测试的代码:

这段代码是使用元类(metaclass)实现的单例模式。

首先,定义了一个名为 Singleton 的元类,继承自 type。元类是用来创建类的类,通过指定一个类的元类,可以控制创建类的行为。

Singleton 元类中,重写了 __call__ 方法。该方法在创建类的实例时被调用。在这个方法中,首先检查类 cls 是否具有 _instance 属性。如果没有该属性,则调用 super().__call__(*args, **kwargs) 创建类的实例,并将其赋值给 _instance 属性。如果已经存在 _instance 属性,则直接返回该属性的值,不再创建新的实例。

接下来,定义了 User 类,并指定它的元类为 Singleton。因此,当创建 User 类的实例时,会调用 Singleton 元类的 __call__ 方法来控制单例对象的创建。

上边的代码案例利用元类的特性,在创建类的实例时判断是否已经存在 _instance 属性,从而实现单例模式。

我们来看看代码运行后输出的结果:

好了,以上就是今天《python单例模式的使用》的全部案例了,觉得不错的话,记得点赞 在看 转发 关注哈。您的每一次支持都是对shigen莫大的鼓励。


shigen一起,每天不一样!

相关推荐
全干engineer16 分钟前
Flask 入门教程:用 Python 快速搭建你的第一个 Web 应用
后端·python·flask·web
nightunderblackcat19 分钟前
新手向:Python网络编程,搭建简易HTTP服务器
网络·python·http
李昊哲小课22 分钟前
pandas销售数据分析
人工智能·python·数据挖掘·数据分析·pandas
C嘎嘎嵌入式开发43 分钟前
python之set详谈
开发语言·python
之歆1 小时前
Python-正则表达式-信息提取-滑动窗口-数据分发-文件加载及分析器-浏览器分析-学习笔记
python·学习·正则表达式
往日情怀酿做酒 V17639296381 小时前
pytorch的介绍以及张量的创建
人工智能·pytorch·python
豌豆花下猫2 小时前
Python 潮流周刊#110:JIT 编译器两年回顾,AI 智能体工具大爆发(摘要)
后端·python·ai
June bug3 小时前
【Python基础】变量、运算与内存管理全解析
开发语言·python·职场和发展·测试
蹦蹦跳跳真可爱5893 小时前
Python----OpenCV(几何变换--图像平移、图像旋转、放射变换、图像缩放、透视变换)
开发语言·人工智能·python·opencv·计算机视觉
蹦蹦跳跳真可爱5893 小时前
Python----循环神经网络(Transformer ----Layer-Normalization(层归一化))
人工智能·python·rnn·transformer