单例

目标
单例设计模式
new 方法
Python 中的单例

  1. 单例设计模式
    设计模式

设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案
使用 设计模式 是为了可重用代码、让代码更容易被他人理解、保证代码可靠性
单例设计模式

目的 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例
每一次执行 类名() 返回的对象,内存地址是相同的
单例设计模式的应用场景
音乐播放 对象
回收站 对象
打印机 对象
……
02. new 方法
使用 类名() 创建对象时,Python 的解释器 首先 会 调用 new 方法为对象 分配空间
new 是一个 由 object 基类提供的 内置的静态方法,主要作用有两个:

  1. 在内存中为对象 分配空间
  2. 返回 对象的引用
    Python 的解释器获得对象的 引用 后,将引用作为 第一个参数,传递给 init 方法
    重写 new 方法 的代码非常固定!

重写 new 方法 一定要 return super().new(cls)
否则 Python 的解释器 得不到 分配了空间的 对象引用,就不会调用对象的初始化方法
注意:new 是一个静态方法,在调用时需要 主动传递 cls 参数
022_对象分配空间和初始化

示例代码

class MusicPlayer(object):def __new__(cls, *args, **kwargs):# 如果不返回任何结果,return super().__new__(cls)def __init__(self):print("初始化音乐播放对象")player = MusicPlayer()print(player)
  1. Python 中的单例
    单例 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例
    定义一个 类属性,初始值是 None,用于记录 单例对象的引用
    重写 new 方法
    如果 类属性 is None,调用父类方法分配空间,并在类属性中记录结果
    返回 类属性 中记录的 对象引用
    023_单例流程
class MusicPlayer(object):# 定义类属性记录单例对象引用instance = Nonedef __new__(cls, *args, **kwargs):# 1. 判断类属性是否已经被赋值if cls.instance is None:cls.instance = super().__new__(cls)# 2. 返回类属性的单例引用return cls.instance

只执行一次初始化工作
在每次使用 类名() 创建对象时,Python 的解释器都会自动调用两个方法:
new 分配空间
init 对象初始化
在上一小节对 new 方法改造之后,每次都会得到 第一次被创建对象的引用
但是:初始化方法还会被再次调用
需求

让 初始化动作 只被 执行一次
解决办法

定义一个类属性 init_flag 标记是否 执行过初始化动作,初始值为 False
init 方法中,判断 init_flag,如果为 False 就执行初始化动作
然后将 init_flag 设置为 True
这样,再次 自动 调用 init 方法时,初始化动作就不会被再次执行 了

class MusicPlayer(object):# 记录第一个被创建对象的引用instance = None# 记录是否执行过初始化动作init_flag = Falsedef __new__(cls, *args, **kwargs):# 1. 判断类属性是否是空对象if cls.instance is None:# 2. 调用父类的方法,为第一个对象分配空间cls.instance = super().__new__(cls)# 3. 返回类属性保存的对象引用return cls.instancedef __init__(self):if not MusicPlayer.init_flag:print("初始化音乐播放器")MusicPlayer.init_flag = True#创建多个对象
player1 = MusicPlayer()
print(player1)player2 = MusicPlayer()
print(player2)

Python 之 单例相关推荐

  1. Python(25)-单例设计模式

    单例设计模式 1.单例设计模式 2.__new__方法 3.初始动作只执行一次 本系列博文来自学习<Python基础视频教程>笔记整理,视屏教程连接地址:http://yun.itheim ...

  2. Python实现单例

    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 我们在使 ...

  3. python:单例设计模式

    学习目标: python单例设计模式 学习内容: 1.设计模式:前人工作的总结和提炼,针对某一特定问题的成熟的解决方案 使用设计模式:可重用代码.让代码更容易被他人理解.保证代码可靠性 2.单例设计模 ...

  4. python线程安全的单例_[python笔记] 单例的几种实现方式(线程安全)

    单例实现方式: 1.单例装饰器; 2.使用类: 3.使用元类 1.单例装饰器(非线程安全) 通过装饰器使一个类变成单例类,但是并非线程安全的,多线程状态下,每个线程创建不同的实例,因为没有加线程锁,所 ...

  5. python实现单例_Python 实现单例模式

    Python 实现单例模式 # 使用Python实现单例模式 # 方法一: 使用__new__方法 class SingleTon(object): def __new__(cls, *args, * ...

  6. 有没有简单优雅的方法来定义单例? [重复]

    这个问题已经在这里有了答案 : 在Python中创建单例 (22个答案) 去年关闭. 似乎有很多方法可以在Python中定义单例 . 关于堆栈溢出是否有共识? #1楼 Python文档确实涵盖了这一点 ...

  7. python基础知识整理 第七节:单例设计模式、异常、模块、包、制作模块、文件

    1.单例设计模式 单例设计模式就是为对象在内存中分配空间的时候,永远只会返回一个唯一的固定的内存空间.这样就能保证在内存中这个类的对象只有唯一的一份,这个就叫做单例.(为对象分配空间使用的是内置方法_ ...

  8. python编程入门单例_常见的在Python中实现单例模式的三种方法

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在 ...

  9. 在Python中创建单例

    这个问题不是为了讨论是否需要单例设计模式 ,是否是反模式,还是针对任何宗教战争,而是要讨论如何以最pythonic的方式在Python中最好地实现此模式. 在这种情况下,我定义"最pytho ...

最新文章

  1. python实训心得2000_实训总结万能版2000字五篇
  2. 我是如何自学 Python 的
  3. python 查看当前系统Python版本
  4. BigDecimal使用时的参数详解
  5. list里面的数据按3个字段排序_Python数据分析:探索性分析
  6. 三只松鼠:阿里云数据中台基座上的多渠道、多业态生长
  7. php金字塔手动输入行数,[菜鸟学php] php版自定义函数实现金字塔
  8. Java SringBoot demo
  9. ASP.NET关闭下载窗口
  10. 愤怒的小鸟4只编外鸟_幼儿园小班游戏教案小鸟找食
  11. 电力负荷预测数据集(2018.1-2020.12,间隔15min,10w多条,含温度、风速等天气因素特征)
  12. 使用PHP和JS对小米主题商店下载地址解析
  13. Dota2 AI 简易开发教程
  14. 【jQuery】货币格式化
  15. 游戏服务器架构演化史
  16. c++除法保留小数_小学数学整数和小数的应用题解答方法公式汇总,新学期必备...
  17. 计算机网络 华南理工大学期末重点 第二章 物理层 谢希仁
  18. hibernate进行sum查询
  19. 【软考】 5 计算机网络
  20. zucc c语言上机答案,ZUCC第三章 习题答案.doc

热门文章

  1. left join 最后一条_一条Mysql查询语句的西天取经之路,你真的了解吗?
  2. python 读取csv_Python实现CSV数据的读取--两种方法实现
  3. Redis之-字符串类型
  4. spring cloud简介之最好参考
  5. Python开源软件大全(内附源码)
  6. cacti 安装与配置
  7. Linux命令解释之grep
  8. ajax传回的数据做表格,Datatables ajax返回的数据顺序与表格中的数据顺序不一致...
  9. (四)揭开数据分析方案的神秘面纱——一案在手,成竹在胸
  10. ERROR 1045 (28000): Access denied for user 'backup'@'mysql' (using password: YES)