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网络编程实例简析
Sep 26 Python
Python中模块pymysql查询结果后如何获取字段列表
Jun 05 Python
使用python实现接口的方法
Jul 07 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
Apr 21 Python
python爬虫实例详解
Jun 19 Python
python3 爬取图片的实例代码
Nov 06 Python
Python父目录、子目录的相互调用方法
Feb 16 Python
浅谈python图片处理Image和skimage的区别
Aug 04 Python
python创建与遍历List二维列表的方法
Aug 16 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
Sep 25 Python
利用matplotlib实现根据实时数据动态更新图形
Dec 13 Python
利用python绘制数据曲线图的实现
Apr 09 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
解析php5配置使用pdo
2013/07/03 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
flash 得到自身url参数的代码
2009/11/15 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
Node.js 的异步 IO 性能探讨
2014/10/08 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
Python 命令行参数sys.argv
2008/09/06 Python
python迭代器的使用方法实例
2013/11/21 Python
tensorflow中next_batch的具体使用
2018/02/02 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
Python中正则表达式的用法总结
2019/02/22 Python
pip指定python位置安装软件包的方法
2019/07/12 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
2020/03/06 Python
使用HTML5和CSS3制作一个模态框的示例
2018/03/07 HTML / CSS
英国的屈臣氏:Boots博姿
2017/12/23 全球购物
机电专业大学生求职信
2013/10/04 职场文书
捐书寄语赠言
2014/01/18 职场文书
学生个人自我鉴定
2014/03/26 职场文书
与美同行演讲稿
2014/09/13 职场文书
公务员四风问题对照检查材料整改措施
2014/09/26 职场文书
中标通知书
2015/04/17 职场文书
Python面向对象编程之类的概念
2021/11/01 Python
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle