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的几个高级语法概念浅析(lambda表达式闭包装饰器)
May 28 Python
python下载图片实现方法(超简单)
Jul 21 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
Dec 12 Python
python中的随机函数小结
Jan 27 Python
详解python tkinter教程-事件绑定
Mar 28 Python
Django实现发送邮件功能
Jul 18 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
Feb 21 Python
Python如何通过百度翻译API实现翻译功能
Apr 02 Python
Python基于codecs模块实现文件读写案例解析
May 11 Python
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
Apr 06 Python
python 自动化偷懒的四个实用操作
Apr 11 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 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
如何开发一个虚拟域名系统
2006/10/09 PHP
PHP Smarty生成EXCEL文档的代码
2008/08/23 PHP
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
PHP直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
php自动加载方式集合
2016/04/04 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
onpropertypchange
2006/07/01 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
2013/08/19 Javascript
node中socket.io的事件使用详解
2014/12/15 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
详解Vuex管理登录状态
2017/11/13 Javascript
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
详解React 条件渲染
2020/07/08 Javascript
python版本坑:md5例子(python2与python3中md5区别)
2017/06/20 Python
Python修改文件往指定行插入内容的实例
2019/01/30 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
python+opencv实现车牌定位功能(实例代码)
2019/12/24 Python
python小项目之五子棋游戏
2019/12/26 Python
手把手教你实现一个canvas智绘画板的方法
2019/03/04 HTML / CSS
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
ajax是什么及其工作原理
2012/02/08 面试题
土木建筑学生自我评价
2014/01/14 职场文书
工会趣味活动方案
2014/08/18 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
工作经验交流材料
2014/12/30 职场文书
领导欢迎词致辞
2015/01/23 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python
Tomcat弱口令复现及利用
2022/05/06 Servers