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执行使用shell命令方法分享
Nov 08 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
Jan 31 Python
pandas数据清洗,排序,索引设置,数据选取方法
May 18 Python
tensorflow 打印内存中的变量方法
Jul 30 Python
Python封装原理与实现方法详解
Aug 28 Python
Python线程同步的实现代码
Oct 03 Python
python2与python3的print及字符串格式化小结
Nov 30 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
Python选择网卡发包及接收数据包
Apr 04 Python
使用python远程操作linux过程解析
Dec 04 Python
python利用platform模块获取系统信息
Oct 09 Python
详解python 条件语句和while循环的实例代码
Dec 28 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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
一个高ai的分页函数和一个url函数
2006/10/09 PHP
简体中文转换为繁体中文的PHP函数
2006/10/09 PHP
基于PHP magic_quotes_gpc的使用方法详解
2013/06/24 PHP
图片按比例缩放函数
2006/06/26 Javascript
限制文本字节数js代码
2007/03/06 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
2013/08/09 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
javascript中的return和闭包函数浅析
2014/06/06 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
react高阶组件经典应用之权限控制详解
2017/09/07 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
浅谈VUE单页应用首屏加载速度优化方案
2018/08/28 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
eslint+prettier统一代码风格的实现方法
2020/07/22 Javascript
vue-router 按需加载 component: () => import() 报错的解决
2020/09/22 Javascript
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
python 获取毫秒数,计算调用时长的方法
2019/02/20 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
python set集合使用方法解析
2019/11/05 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
英语翻译系毕业生求职信
2013/09/29 职场文书
红色故事演讲稿
2014/05/22 职场文书
员工开除通知书
2015/04/25 职场文书
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js