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 判断自定义对象类型
Mar 21 Python
Python实现的圆形绘制(画圆)示例
Jan 31 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
Jan 17 Python
python判断所输入的任意一个正整数是否为素数的两种方法
Jun 27 Python
Python日志syslog使用原理详解
Feb 18 Python
Python Django view 两种return的实现方式
Mar 16 Python
python爬虫实现POST request payload形式的请求
Apr 30 Python
使用Python实现微信拍一拍功能的思路代码
Jul 09 Python
python中的django是做什么的
Jul 31 Python
python 监控服务器是否有人远程登录(详细思路+代码)
Dec 18 Python
解决Pytorch半精度浮点型网络训练的问题
May 24 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备份/还原MySQL数据库的代码
2011/01/06 PHP
PHP函数eval()介绍和使用示例
2014/08/20 PHP
php采用ajax数据提交post与post常见方法总结
2014/11/10 PHP
PHP实现163邮箱自动发送邮件
2016/03/29 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
2017/02/05 PHP
List the UTC Time on a Computer
2007/06/11 Javascript
点击显示指定元素隐藏其他同辈元素的方法
2014/02/19 Javascript
javascript的switch用法注意事项分析
2015/02/02 Javascript
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
JS实现静态页面搜索并高亮显示功能完整示例
2017/09/19 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
javascript实现blob加密视频源地址的方法
2019/08/08 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Flask框架信号用法实例分析
2018/07/24 Python
详解Python中pandas的安装操作说明(傻瓜版)
2019/04/08 Python
numpy.random模块用法总结
2019/05/27 Python
python elasticsearch环境搭建详解
2019/09/02 Python
Django框架模板用法入门教程
2019/11/04 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
医药工作者的求职信范文
2013/09/21 职场文书
文员个人求职自荐信
2013/09/21 职场文书
营业经理岗位职责
2013/11/10 职场文书
《我要的是葫芦》教学反思
2014/02/23 职场文书
创业计划书之寿司
2019/07/19 职场文书
Python 批量下载阴阳师网站壁纸
2021/05/19 Python