01. 单例设计模式

  • 设计模式
    设计模式是千人工作的总结和提炼.通常,被人们广为流传的设计模式都是针对某一特定问题的成熟的解决方案
  • 单例设计模式
    目的–让类创建的对象,在系统中只有唯一的一个实例
    每一次执行类名()返回的对象,内存地址都是相同的.

单例设计模式的应用场景:

  • 音乐播放 对象
  • 回收站 对象
  • 打印机 对象

02. __new__方法

  • 使用类名()创建对象时,Python的解释器首先会调用__new__方法为对象分配空间
  • __new__是一个由object基类提供的内置静态方法,主要作用有两个
    ①在内存中为对象分配空间
    ②返回对象的引用
  • Python的解释器获得对象的引用后,将引用作为第一个参数,传递给__init__方法

重写__new__方法的代码非常固定

  • 重写__new__方法一定要return super().__new__(cls)
  • 否则Python的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法
  • 注意:__new__是一个静态方法,在调用时需要主动传递cls参数
class MusicPlayer:def __new__(cls, *args, **kwargs):# 1.创建对象时,new方法会被自动调用print("创建对象,分配空间")# 2.为对象分配空间instance = super().__new__(cls)# 3.返回对象的引用return instancedef __init__(self):print("播放器初始化")player = MusicPlayer()
print(player)

运行结果:

03. Python中的单例

  • 单例–让类创建的对象,在系统中只有唯一的一个实例
    ①定义一个类属性,初始值是None,用于记录单例对象的引用
    ②重写__new__方法
    ③如果类属性is None,调用父类方法分配空间,并在类属性中记录结果
    ④返回类属性中记录的对象引用


04.初始化动作只执行一次

  • 再每次使用 类名() 创建对象时,Python的解释器都会自动调用两个方法:
    ①__new__分配空间
    ②__init__对象初始化
  • 由刚才的代码可知,__new__方法改造后,每次都会得到第一次被创建对象的引用\
  • 但是:初始化方法还会被再次调用

需求:

  • 让初始化动作只被执行一次

解决办法:
①定义一个类属性init_flag标记是否执行过初始化动作,初始值为False
②在__init__方法中,对init_flag进行判断,如果为False就执行初始化动作
③然后把init_flag赋值为True
④这样,再次调用__init__方法时,初始化动作就不会被执行了

class MusicPlayer:init_flag = Falsedef __init__(self):if not MusicPlayer.init_flag:print("初始化播放器")MusicPlayer.init_flag = Trueelse:return# 创建多个对象
player1 = MusicPlayer()
player2 = MusicPlayer()

运行结果:

面向对象(Python):学习笔记之单例模式相关推荐

  1. Python学习笔记(十九)面向对象 - 继承

    Python学习笔记(十九)面向对象 - 继承 一.继承的概念 # 继承:子类继承父类的所有方法和属性# 1. 子类 class A(object):def __init__(self):self.n ...

  2. python学习笔记目录

    人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...

  3. OpenCV之Python学习笔记(1)(2): 图像的载入、显示和保存 图像元素的访问、通道分离与合并

    OpenCV之Python学习笔记 一直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看到一本国外的新书< ...

  4. Python学习笔记:Day 16 编写移动App

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. Python学习笔记:Day15 部署Web App

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  6. Python学习笔记:Day14 完成Web App

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  7. Python学习笔记:Day13 提升开发效率

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  8. Python学习笔记:Day 12 编写日志列表页

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此, 写下这些 ...

  9. Python学习笔记:Day11 编写日志创建页

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  10. Python学习笔记:Day 10 用户注册和登陆

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

最新文章

  1. 用java调用oracle存储过程总结
  2. 如何用AR升级星巴克体验?阿里工程师祭出了“三板斧”
  3. 汇编---输出AX的地址值
  4. android中ActionBar的几个属性
  5. 计蒜客挑战难题:泥塑课
  6. CSS基本选择器之类选择器多类名(CSS、HTML)
  7. Spring boot中的Http压缩配置
  8. php text换行_php实现文字换行
  9. 相机sd卡格式化后还能不能数据再恢复
  10. DIGITS使用步骤
  11. 嵌入式单片机基础篇(十九)之一般TFTLCD 模块的使用流程
  12. 【笔记】ThreadFactory自定义线程名前缀
  13. c语言spoc测验成绩比重,SPOC混合教学模式在C语言程序设计课程的应用
  14. 优秀的人都在读的10本好书!
  15. BZOJ[3039]玉蟾宫 悬线法
  16. java咖啡机如何清洗_这样清洗咖啡机最简单有效
  17. 思科交换机接口配置trunk_Cisco交换机配置VLAN与TRUNK
  18. 如何搭建自己的cdn
  19. JDK8 下载与安装教程,超简单版(Windows)
  20. Blender图解教程:Blender导出Gif的最佳解决方案(附工具下载)

热门文章

  1. [2019杭电多校第十场][hdu6701]Make Rounddog Happy
  2. [2019杭电多校第四场][hdu6621]K-th Closest Distance(主席树)
  3. Git和Github详细教程
  4. jeecg导出Excel
  5. Mybatis sqlsession解析
  6. MiniProfiler工具介绍
  7. MFC绘制图片闪烁详解
  8. JavaWeb出现404一个很隐蔽的原因
  9. VB INET控件的全部用法
  10. 转载 网络上的8051 free IP core资源