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中3种内建数据结构:列表、元组和字典
Nov 30 Python
Python实现抓取百度搜索结果页的网站标题信息
Jan 22 Python
python使用win32com库播放mp3文件的方法
May 30 Python
python查找指定具有相同内容文件的方法
Jun 28 Python
python通过pip更新所有已安装的包实现方法
May 19 Python
学习Python selenium自动化网页抓取器
Jan 20 Python
Python中一行和多行import模块问题
Apr 01 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
python将秒数转化为时间格式的实例
Sep 16 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
Sep 02 Python
Python文本处理简单易懂方法解析
Dec 19 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
PHP设计模式之命令模式示例详解
2020/12/20 PHP
简单的js表单验证函数
2013/10/28 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
详解Angular中$cacheFactory缓存的使用
2016/08/19 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
JavaScript函数、闭包、原型、面向对象学习笔记
2018/09/06 Javascript
layui 阻止图片上传的实例(before方法)
2019/09/26 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
pandas 选择某几列的方法
2018/07/03 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
Python多分支if语句的使用
2020/09/03 Python
python 写一个性能测试工具(一)
2020/10/24 Python
python drf各类组件的用法和作用
2021/01/12 Python
污水厂厂长岗位职责
2014/01/04 职场文书
春节晚会主持词
2014/03/24 职场文书
商铺租赁意向书
2014/04/01 职场文书
市场部经理岗位职责
2014/04/10 职场文书
《东方明珠》教学反思
2014/04/20 职场文书
学校安全工作汇报材料
2014/08/16 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
2015年班干部工作总结
2015/04/29 职场文书
手术室消毒隔离制度
2015/08/05 职场文书
2019大学生实习报告
2019/06/21 职场文书
Python中异常处理用法
2021/11/27 Python
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android