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 相关文章推荐
利用Python绘制数据的瀑布图的教程
Apr 07 Python
在类Unix系统上开始Python3编程入门
Aug 20 Python
python中实现精确的浮点数运算详解
Nov 02 Python
python之virtualenv的简单使用方法(必看篇)
Nov 25 Python
flask-socketio实现WebSocket的方法
Jul 31 Python
Python爬虫实现验证码登录代码实例
May 10 Python
python仿evething的文件搜索器实例代码
May 13 Python
python3 pillow模块实现简单验证码
Oct 31 Python
Django 路由层URLconf的实现
Dec 30 Python
Python如何定义有可选参数的元类
Jul 31 Python
Python面向对象特殊属性及方法解析
Sep 16 Python
python 制作磁力搜索工具
Mar 04 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
配置最新的PHP加MYSQL服务器
2006/10/09 PHP
Cannot modify header information错误解决方法
2008/10/08 PHP
几种有用的变型 PHP中循环语句的用法介绍
2012/01/30 PHP
php批量上传的实现代码
2013/06/09 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
2013/06/25 PHP
php生成图形(Libchart)实例
2013/11/06 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
根据分辩率调用不同的CSS.
2007/01/08 Javascript
js 解决“options为空或不是对象”
2008/12/22 Javascript
JS中Iframe之间传值的方法
2013/03/11 Javascript
Nodejs sublime text 3安装与配置
2014/06/19 NodeJs
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
2016/02/25 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
js装饰设计模式学习心得
2018/02/17 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
jQuery实现form表单序列化转换为json对象功能示例
2018/05/23 jQuery
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
JS回调函数深入理解
2019/10/16 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
[02:28]DOTA2亚洲邀请赛附加赛 RECAP赛事回顾
2015/01/29 DOTA
[01:33]PWL开团时刻DAY2-开雾与反开雾
2020/10/31 DOTA
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
python批量修改文件编码格式的方法
2018/05/31 Python
python 字典套字典或列表的示例
2019/12/16 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
基于Html5实现的react拖拽排序组件示例
2018/08/13 HTML / CSS
信用社员工先进事迹材料
2014/02/04 职场文书
委托证明书
2014/09/17 职场文书
创先争优宣传标语
2014/10/08 职场文书
党组织领导班子整改方案
2014/10/25 职场文书
高一数学教学反思
2016/02/18 职场文书
pandas时间序列之pd.to_datetime()的实现
2022/06/16 Python