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 相关文章推荐
netbeans7安装python插件的方法图解
Dec 24 Python
Python实例之wxpython中Frame使用方法
Jun 09 Python
python动态性强类型用法实例
May 09 Python
python学习教程之使用py2exe打包
Sep 24 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
Jun 11 Python
python使用minimax算法实现五子棋
Jul 29 Python
python随机模块random使用方法详解
Feb 14 Python
python 字符串的驻留机制及优缺点
Jun 19 Python
4款Python 类型检查工具,你选择哪个呢?
Oct 30 Python
Python基于mediainfo批量重命名图片文件
Dec 29 Python
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
May 14 Python
python实现A*寻路算法
Jun 13 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
使用php+xslt在windows平台上
2006/10/09 PHP
PHP 函数语法介绍一
2009/06/14 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
PHP根据传入参数合并多个JS和CSS文件的简单实现
2014/06/13 PHP
ThinkPHP字符串函数及常用函数汇总
2014/07/18 PHP
CodeIgniter与PHP5.6的兼容问题
2015/07/16 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
jquery遍历input取得input的name
2009/04/27 Javascript
javascript 读取图片文件的大小
2009/06/25 Javascript
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
Javascript读取cookie函数代码
2010/10/16 Javascript
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
2016/10/21 Javascript
Bootstrap基本插件学习笔记之按钮(21)
2016/12/08 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
vue router demo详解
2017/10/13 Javascript
利用jqgrid实现上移下移单元格功能
2018/11/07 Javascript
Vue内部渲染视图的方法
2019/09/02 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
2020/07/15 Javascript
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
Python描述符descriptor使用原理解析
2020/03/21 Python
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
什么是数据库锁?Oracle中都有哪些类型的锁?
2015/08/21 面试题
班级聚会策划书
2014/01/16 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
政府绩效管理实施方案
2014/05/04 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
辩护词格式
2015/05/22 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书
Mysql排序的特性详情
2021/11/01 MySQL