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文档生成工具pydoc使用介绍
Jun 02 Python
python中强大的format函数实例详解
Dec 05 Python
Python Pexpect库的简单使用方法
Jan 29 Python
python和mysql交互操作实例详解【基于pymysql库】
Jun 04 Python
Django获取应用下的所有models的例子
Aug 30 Python
python使用sklearn实现决策树的方法示例
Sep 12 Python
在spyder IPython console中,运行代码加入参数的实例
Apr 20 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
Apr 20 Python
在CentOS7下安装Python3教程解析
Jul 09 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 Python
python实现学生信息管理系统(精简版)
Nov 27 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获取网络上文件
2006/10/09 PHP
PHP 加密解密内部算法
2010/04/22 PHP
PHP学习之字符串比较和查找
2011/04/17 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
2013/06/24 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
QQ邮箱的一个文本编辑器代码
2007/03/14 Javascript
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
javascript实现数字验证码的简单实例
2014/02/10 Javascript
Extjs grid添加一个图片状态或者按钮的方法
2014/04/03 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
2017/02/20 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
原生JS实现烟花效果
2020/03/10 Javascript
vue实现虚拟列表功能的代码
2020/07/28 Javascript
openlayers实现地图弹窗
2020/09/25 Javascript
antd配置config-overrides.js文件的操作
2020/10/31 Javascript
[01:09:01]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第一场 10.28
2020/10/28 DOTA
简单介绍Python中的几种数据类型
2016/01/02 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
python3对拉勾数据进行可视化分析的方法详解
2019/04/03 Python
python3安装OCR识别库tesserocr过程图解
2020/04/02 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
Python3如何在服务器打印资产信息
2020/08/27 Python
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
英国香水店:The Perfume Shop
2017/03/27 全球购物
美国领先的眼镜和太阳镜在线零售商:Glasses.com
2019/08/26 全球购物
日语专业毕业生自荐书
2014/06/18 职场文书
矛盾论读书笔记
2015/06/29 职场文书
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript