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代码实例
Feb 04 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
May 17 Python
Python3连接MySQL(pymysql)模拟转账实现代码
May 24 Python
Python中列表和元组的使用方法和区别详解
Dec 30 Python
Python 实现微信防撤回功能
Apr 29 Python
Python基本数据结构之字典类型dict用法分析
Jun 08 Python
pygame实现五子棋游戏
Oct 29 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
在Pytorch中计算自己模型的FLOPs方式
Dec 30 Python
浅谈python的elementtree模块处理中文注意事项
Mar 06 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 Python
基于Python编写一个监控CPU的应用系统
Jun 25 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 Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
非常精妙的PHP递归调用与静态变量使用
2012/12/16 PHP
php处理复杂xml数据示例
2016/07/11 PHP
PHP实现无限分类的实现方法
2016/11/14 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
2017/12/28 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
JS操作Cookies的小例子
2013/10/15 Javascript
$("").click与onclick的区别示例介绍
2014/09/25 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
jQuery中clearQueue()方法用法实例
2014/12/29 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
浅谈发布订阅模式与观察者模式
2019/04/09 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
[03:42]2016国际邀请赛中国区预选赛首日现场玩家采访
2016/06/26 DOTA
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
Python中pillow知识点学习
2018/04/30 Python
对python调用RPC接口的实例详解
2019/01/03 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
基于Python实现粒子滤波效果
2020/12/01 Python
匡威英国官网:Converse英国
2018/12/02 全球购物
公益活动策划方案
2014/01/09 职场文书
小学毕业感言50字
2014/02/16 职场文书
工作作风承诺书
2014/08/30 职场文书
群众路线个人整改措施
2014/10/24 职场文书
详解Mysql和Oracle之间的误区
2021/05/18 MySQL
Java的Object类的九种方法
2022/04/13 Java/Android