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中字符编码简介、方法及使用建议
Jan 08 Python
Python中使用第三方库xlrd来读取Excel示例
Apr 05 Python
调试Python程序代码的几种方法总结
Apr 28 Python
Django中实现点击图片链接强制直接下载的方法
May 14 Python
django ajax json的实例代码
May 29 Python
pip命令无法使用的解决方法
Jun 12 Python
python查看列的唯一值方法
Jul 17 Python
在PyCharm中实现关闭一个死循环程序的方法
Nov 29 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
May 15 Python
Python3实现汉语转换为汉语拼音
Jul 08 Python
Python 异常处理Ⅳ过程图解
Oct 18 Python
python本地文件服务器实例教程
May 02 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
2006/10/09 PHP
3种平台下安装php4经验点滴
2006/10/09 PHP
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
php中url函数介绍及使用示例
2014/02/13 PHP
php程序内部post数据的方法
2015/03/31 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
ThinkPHP 5.x远程命令执行漏洞复现
2019/09/23 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
javascript实现信息的显示和隐藏如注册页面
2013/12/03 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
2014/12/08 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
Node.js获取前端ajax提交的request信息
2017/02/20 Javascript
PHP实现本地图片上传和验证功能
2017/02/27 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
[01:08]DOTA2次级职业联赛 - Shield战队宣传片
2014/12/01 DOTA
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
2014/04/15 Python
Python基于有道实现英汉字典功能
2015/07/25 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
python中自带的三个装饰器的实现
2019/11/08 Python
为什么称python为胶水语言
2020/06/16 Python
Python实现FTP文件定时自动下载的步骤
2020/12/19 Python
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
酒吧创业计划书
2014/01/18 职场文书
《狼》教学反思
2014/03/02 职场文书
委托书格式
2014/08/01 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
如何在C++中调用Python
2021/05/21 Python