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 相关文章推荐
Python3实现生成随机密码的方法
Aug 23 Python
在Python中使用itertools模块中的组合函数的教程
Apr 13 Python
Python Matplotlib库入门指南
May 18 Python
Python函数式编程指南(二):从函数开始
Jun 24 Python
Python3.2模拟实现webqq登录
Feb 15 Python
Python快速从注释生成文档的方法
Dec 26 Python
Python操作mysql数据库实现增删查改功能的方法
Jan 15 Python
python实现的分析并统计nginx日志数据功能示例
Dec 21 Python
使用Keras画神经网络准确性图教程
Jun 15 Python
Python ellipsis 的用法详解
Nov 20 Python
python自动计算图像数据集的RGB均值
Jun 18 Python
python获取对象信息的实例详解
Jul 07 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提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
PHP实现微信申请退款功能
2018/10/01 PHP
JQuery中extend使用介绍
2014/03/13 Javascript
JS实现div居中示例
2014/04/17 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
Mint UI 基于 Vue.js 移动端组件库
2017/11/07 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
vue-for循环嵌套操作示例
2019/01/28 Javascript
vue 清空input标签 中file的值操作
2020/07/21 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
Python中replace方法实例分析
2014/08/20 Python
Python中itertools模块用法详解
2014/09/25 Python
python基于queue和threading实现多线程下载实例
2014/10/08 Python
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
基于keras输出中间层结果的2种实现方式
2020/01/24 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
2020/02/10 Python
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
汇智创新科技发展有限公司
2015/12/06 面试题
一套软件开发工程师笔试题
2015/05/18 面试题
岳父生日宴会答谢词
2014/01/13 职场文书
优秀党支部事迹材料
2014/01/14 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
停车场管理协议书范本
2014/10/08 职场文书
歼十出击观后感
2015/06/11 职场文书
初婚初育证明范本
2015/06/18 职场文书
趣味运动会广播稿
2015/08/19 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
Redis读写分离搭建的完整步骤
2021/09/14 Redis