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中 ? : 三元表达式的使用介绍
Oct 09 Python
解决Python出现_warn_unsafe_extraction问题的方法
Mar 24 Python
python中实现指定时间调用函数示例代码
Sep 08 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 Python
Python3 执行Linux Bash命令的方法
Jul 12 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
Oct 23 Python
新建文件时Pycharm中自动设置头部模板信息的方法
Apr 17 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
如何在 Matplotlib 中更改绘图背景的实现
Nov 26 Python
Django集成MongoDB实现过程解析
Dec 01 Python
实例详解Python的进程,线程和协程
Mar 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 和 XML: 使用expat函数(三)
2006/10/09 PHP
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
2012/09/07 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
用JS判断IE版本的代码 超管用!
2011/08/09 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
使用documentElement正确取得当前可见区域的大小
2014/07/25 Javascript
详解AngularJs中$sce与$sceDelegate上下文转义服务
2016/09/21 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
vue cli webpack中使用sass的方法
2018/02/24 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
vue2 设置router-view默认路径的实例
2018/09/20 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
Python编写Windows Service服务程序
2018/01/04 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
Python异常处理操作实例详解
2018/08/28 Python
python获取url的返回信息方法
2018/12/17 Python
python requests post多层字典的方法
2018/12/27 Python
房屋改造计划书
2014/01/10 职场文书
幼儿园教师教学反思
2014/02/06 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
申报优秀教师材料
2014/12/16 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python