Python单例模式的四种创建方式实例解析


Posted in Python onMarch 04, 2020

单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

在 Python 中,我们可以用多种方法来实现单例模式:

  • 使用模块
  • 使用__new__使
  • 用装饰器(decorator)
  • 使用元类(metaclass)

使用模块

其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成.pyc文件,当第二次导入时,就会直接加载.pyc文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:

Python单例模式的四种创建方式实例解析

将上面的代码保存在文件mysingleton.py中,然后这样使用:

Python单例模式的四种创建方式实例解析

使用__new__

为了使类只能出现一个实例,我们可以使用__new__来控制实例的创建过程,代码如下:

Python单例模式的四种创建方式实例解析

在上面的代码中,我们将类的实例和一个类变量_instance关联起来,如果cls._instance为 None 则创建实例,否则直接返回cls._instance。

执行情况如下:

Python单例模式的四种创建方式实例解析

使用装饰器

我们知道,装饰器(decorator)可以动态地修改一个类或函数的功能。这里,我们也可以使用装饰器来装饰某个类,使其只能生成一个实例,代码如下:

Python单例模式的四种创建方式实例解析

在上面,我们定义了一个装饰器singleton,它返回了一个内部函数getinstance,该函数会判断某个类是否在字典instances中,如果不存在,则会将cls作为 key,cls(*args, **kw)作为 value 存到instances中,否则,直接返回instances[cls]。

使用 metaclass

元类(metaclass)可以控制类的创建过程,它主要做三件事:

拦截类的创建修改类的定义返回修改后的类

使用元类实现单例模式的代码如下:

Python单例模式的四种创建方式实例解析

小结Python 的模块是天然的单例模式,这在大部分情况下应该是够用的,当然,我们也可以使用装饰器、元类等方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 时间处理datetime实例
Sep 06 Python
python使用循环实现批量创建文件夹示例
Mar 25 Python
python正则表达式re模块详细介绍
May 29 Python
python实现通过队列完成进程间的多任务功能示例
Oct 28 Python
pytorch torch.expand和torch.repeat的区别详解
Nov 05 Python
Python实现把类当做字典来访问
Dec 16 Python
Python:type、object、class与内置类型实例
Dec 25 Python
Pyecharts绘制全球流向图的示例代码
Jan 08 Python
python程序如何进行保存
Jul 03 Python
浅析Python 序列化与反序列化
Aug 05 Python
python 实现单例模式的5种方法
Sep 23 Python
python实现录制全屏和选择区域录屏功能
Feb 05 Python
通过实例解析Python return运行原理
Mar 04 #Python
Python递归函数特点及原理解析
Mar 04 #Python
Mac中PyCharm配置Anaconda环境的方法
Mar 04 #Python
python实现简单井字棋游戏
Mar 04 #Python
pycharm中import呈现灰色原因的解决方法
Mar 04 #Python
使用Pyhton 分析酒店针孔摄像头
Mar 04 #Python
pycharm新建Vue项目的方法步骤(图文)
Mar 04 #Python
You might like
php excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
2019/05/29 PHP
JavaScript面向对象编程
2008/03/02 Javascript
JavaScript 图像动画的小demo
2012/05/23 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
JS实现窗口加载时模拟鼠标移动的方法
2015/06/03 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
2016/11/24 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
使用JavaScript实现node.js中的path.join方法
2018/08/12 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
2018/08/31 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
vue-router懒加载的3种方式汇总
2021/02/28 Vue.js
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
Python 功能和特点(新手必学)
2015/12/30 Python
Python读取系统文件夹内所有文件并统计数量的方法
2018/10/23 Python
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
python矩阵/字典实现最短路径算法
2019/01/17 Python
Python3远程监控程序的实现方法
2019/07/15 Python
django数据关系一对多、多对多模型、自关联的建立
2019/07/24 Python
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
应用服务器有那些
2012/01/19 面试题
外贸公司实习自我鉴定
2013/09/24 职场文书
护士实习自我鉴定
2013/10/22 职场文书
生产部经理岗位职责
2013/12/16 职场文书
产品促销活动策划书
2014/01/15 职场文书
服务之星获奖感言
2014/01/21 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
如何用RabbitMQ和Swoole实现一个异步任务系统
2021/05/29 PHP
2022年四月新番
2022/03/15 日漫
MySQL池化框架学习接池自定义
2022/07/23 MySQL