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 09 Python
JPype实现在python中调用JAVA的实例
Jul 19 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
对python中使用requests模块参数编码的不同处理方法
May 18 Python
django manage.py扩展自定义命令方法
May 27 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
Jul 18 Python
python批量修改文件夹及其子文件夹下的文件内容
Mar 15 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
使用keras根据层名称来初始化网络
May 21 Python
python框架flask入门之环境搭建及开启调试
Jun 07 Python
Python利用命名空间解析XML文档
Aug 10 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
PHP4实际应用经验篇(7)
2006/10/09 PHP
PHP MSSQL 存储过程的方法
2008/12/24 PHP
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
php简单压缩css样式示例
2016/09/22 PHP
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
原生js实现日期联动
2015/01/12 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
详解VueJS应用中管理用户权限
2018/02/02 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
JavaScript函数的4种调用方法实例分析
2019/03/05 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
[01:08:57]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第二场
2014/05/24 DOTA
python 实现在Excel末尾增加新行
2018/05/02 Python
Python列表list排列组合操作示例
2018/12/18 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
Python3实现汉语转换为汉语拼音
2019/07/08 Python
Python对excel的基本操作方法
2021/02/18 Python
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
年终考核评语
2014/01/19 职场文书
《姥姥的剪纸》教学反思
2014/02/25 职场文书
合伙经营协议书范本
2014/09/13 职场文书
三八红旗手先进事迹材料(2016推荐版)
2016/02/25 职场文书
Meta增速拉垮,元宇宙难当重任
2022/04/29 数码科技
Mysql数据库group by原理详解
2022/07/07 MySQL