python单例设计模式实现解析


Posted in Python onJanuary 07, 2020

这篇文章主要介绍了python单例设计模式实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

所谓单例,就是让类创建对象的时候,在系统中只有唯一的一个实例。

(1)定义一个类属性,初始值是None,用于记录单例的引用。

(2)重写__new__方法。

(3)如果类属性是None,调用父类方法分配空间,并在属性中记录结果。

(4)返回属性中记录的对象引用。

class MusicPlayer(object):
  instance = None
  def __new__(cls, *args, **kwargs):
    if cls.instance is None:
      print("创建对象,分配空间")
      cls.instance = super().__new__(cls)
    return cls.instance

  def __init__(self):
    print("播放器初始化")
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)

输出:

python单例设计模式实现解析

我们发现,对象只被创建了一次,当要再创建一个对象时,实际上调用的是已经存在的同一个对象,均是唯一的地址, 但是,我们发现初始化操作却被执行了两次,这不符合我们的要求,解决办法如下:

(1)定义一个类属性init_flag标记是否执行过初始化操作,初始值为False。

(2)在__init__方法中判断是否进行过初始化,如果执行了,将init_flag置为True。

(3)再次调用__init__时,初始化就不会被执行了。

class MusicPlayer(object):
  instance = None
  init_flag = False
  def __new__(cls, *args, **kwargs):
    if cls.instance is None:
      print("创建对象,分配空间")
      cls.instance = super().__new__(cls)
    return cls.instance

  def __init__(self):
    if not MusicPlayer.init_flag:
      print("播放器初始化")
      MusicPlayer.init_flag = True
    else:
      return
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)

输出:

python单例设计模式实现解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Tornado Web服务器多进程启动的2个方法
Aug 04 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
Apr 08 Python
pytorch: tensor类型的构建与相互转换实例
Jul 26 Python
浅谈python 读excel数值为浮点型的问题
Dec 25 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 Python
numpy下的flatten()函数用法详解
May 27 Python
用Python实现最速下降法求极值的方法
Jul 10 Python
python实现点击按钮修改数据的方法
Jul 17 Python
关于python中的xpath解析定位
Mar 06 Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 Python
python自动化操作之动态验证码、滑动验证码的降噪和识别
Aug 30 Python
Python字典生成式、集合生成式、生成器用法实例分析
Jan 07 #Python
linux环境下安装python虚拟环境及注意事项
Jan 07 #Python
Python包,__init__.py功能与用法分析
Jan 07 #Python
Python3实现发送邮件和发送短信验证码功能
Jan 07 #Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 #Python
python 微信好友特征数据分析及可视化
Jan 07 #Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
Jan 07 #Python
You might like
Terran兵种对照表
2020/03/14 星际争霸
php获得当前的脚本网址
2007/12/10 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
解决FLASH需要点击激活的代码
2006/12/20 Javascript
javascript import css实例代码
2008/07/18 Javascript
js常用代码段收集
2011/10/28 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
2016/08/31 Javascript
利用JQuery直接调用asp.net后台的简单方法
2016/10/27 Javascript
微信小程序 网络请求(GET请求)详解
2016/11/16 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
2017/09/11 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
angular4笔记系列之内置指令小结
2018/11/09 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
jQuery实现可以计算进制转换的计算器
2020/10/19 jQuery
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
Django实现组合搜索的方法示例
2018/01/23 Python
Python反转序列的方法实例分析
2018/03/21 Python
python利用requests库进行接口测试的方法详解
2018/07/06 Python
将tensorflow的ckpt模型存储为npy的实例
2018/07/09 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
计算机应用专业自荐信
2014/07/05 职场文书
2015年小学实验室工作总结
2015/07/28 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python