设计模式

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

单例设计模式

  • 单例即指只有一个实例
  • 目的:让该类创建的对象,在系统中只有一个实例
  • 每一次创建此类的对象,内存地址都是相同的

单例设计模式的应用场景

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

__new__函数

  • __new_函数是一个内置函数,用来创建一个实例,在内存中为它开辟一个空间,并返回内存地址

单例模式的思路

  • 定义一个类属性,用以接收实例的地址
  • 拓展__new__函数,判断定义的类属性,如果为空,则调用super().__new__并用类属性接收它返回的地址,然后返回该类属性
  • 如果类属性,则直接返回类属性
  • 这样无论创建多少个对象,他们都指向同一个内存空间,也就是只有一个实例。

单例模式演示

class MusicPlayer(object):
instance = None #用以接收对象的内存地址
init_flag = False #判断__init__()用以标记函数有没有被执行过
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls) # 因为是拓展__new__方法所以必须要执行一次super().__new__,本次执行时创建一个对象(分配内存空间)并返回对象的地址
return cls.instance
# 在单例模式中,一般都会让init方法只被执行一次
def __init__(self):
if MusicPlayer.init_flag:
return
MusicPlayer.init_flag = True
print("被执行了一次") # 创建多个对象
player1 = MusicPlayer()
player2 = MusicPlayer() # 发现两个地址不一样
print(player1)
print(player2)

  运行结果,可以看到两个实例的地址完全相同:

E:\python3\python3.exe F:/PycharmProjects/project3-class/xh_21_单例模式:音乐播放.py
被执行了一次
<__main__.MusicPlayer object at 0x0000000001DF25B0>
<__main__.MusicPlayer object at 0x0000000001DF25B0> Process finished with exit code 0

  

__new__()与__init__()的区别

  • 前者只负责创建实例的空间,返回空间地址
  • 后者为该对象初始化实例属性

其它

请务必检测单码是否足够简单,如if代码可写为:

if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance

  

09 单例设计模式、__new__函数的更多相关文章

  1. Java面向对象 Main函数 静态的应用 单例设计模式

     Java面向对象 Main函数 静态的应用与单例设计模式 知识概要             (1)Main函数的细解 (2)静态的应用,静态变量,静态代码块,静态函数 (3)单例设计模式 1.M ...

  2. JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

    JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...

  3. Python中的单例设计模式

    1)设计模式: 是前人工作的总结和提炼.通常,被人们广泛流传的设计模式.     某一问题的特定解决方案,使用设计模式是为了可重用代码,是代码更容易被人理解, 增加代码的可用性. 2)单例设计模式: ...

  4. Python——单例设计模式

    单例设计模式: 让类创建的对象,在系统中只有唯一的实例, 使用python类内置的__new__()方法实现,__new__()方法在创建对象时会被自动调用,通过重写__new__()方法,使得无论用 ...

  5. java笔记之静态修饰附和单例设计模式

     第六天笔记 静态修饰符static: 一.static修饰成员变量: static用来修饰成员变量叫静态成员变量,没有static修饰的成员变量叫非静态成员变量 静态成员的访问方式: (1)   用 ...

  6. python之单例设计模式

    设计模式之单例模式 单例设计模式是怎么来的?在面向对象的程序设计中,当业务并发量非常大时,那么就会出现重复创建相同的对象,每创建一个对象就会开辟一块内存空间,而这些对象其实是一模一样的,那么有没有办法 ...

  7. IOS中的单例设计模式

    单例设计模式是IOS开发中一种很重要很常用的一种设计模式.它的设计原理是无论请求多少次,始终返回一个实例,也就是一个类只有一个实例.下面是苹果官方文档中关于单例模式的图片: 如图所示,左边的图是默认的 ...

  8. JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖

    JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有 ...

  9. python小总结3(异常、单例设计模式)

    一.异常 AttributeError:试图访问一个对象没有的成员[属性和方法] ValueError:值错误,传入了一个不期望的值 ImportError:无法导入模块或者包:基本上路径问题 Ind ...

随机推荐

  1. LeetCode 第 159 场周赛

    一. 缀点成线(LeetCode-5230) 1.1 题目描述 1.2 解题思路 比较简单的一题,利用公式 y = kx + b,确定好k和b就好,并且要考虑一种情况,函数 x = h. 1.3 解题 ...

  2. Ubuntu16.04启动tomcat缓慢问题之解决方案

    问题信息: -May- ::] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of Secur ...

  3. ubuntu系统五笔输入法安装

    转载:https://jingyan.baidu.com/article/454316ab67d702f7a7c03a1a.html Ubuntu 16.04 在安装时选择中文安装,安装过程中将自动安 ...

  4. 快速创建 Vue 项目

    转载:https://www.jianshu.com/p/c7df292915e7 为了便于 Vue 项目的管理, Vue 团队官方开发了 vue-cli 工具. 本文将带您使用 vue-cli 快速 ...

  5. 基于docker构建flink大数据处理平台

    https://www.cnblogs.com/1ssqq1lxr/p/10417005.html 由于公司业务需求,需要搭建一套实时处理数据平台,基于多方面调研选择了Flink. 初始化Swarm环 ...

  6. Spring Cloud Ribbon 客户端负载均衡 4.3

      在分布式架构中,服务器端负载均衡通常是由Nginx实现分发请求的,而客户端的同一个实例部署在多个应用上时,也需要实现负载均衡.那么Spring Cloud中是否提供了这种负载均衡的功能呢?答案是肯 ...

  7. 【sqlalchemy】

    https://www.cnblogs.com/ccorz/p/5711955.html

  8. c-lodop获取任务页数-回调里给全局变量赋值并加减

    LODOP一个任务里可以自动分页,也可以手动分页,超文本会按照打印项高度或超过纸张会自动分页(相关博文:Lodop打印控件 超文本自动分页),如果是自动分页,是无法知道究竟分了多少页,整个任务打了多少 ...

  9. bootstrap模态框怎么传递参数

    bootstrap参数传递可以用 data-参数名 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml&qu ...

  10. Shell脚本运行报错Bad substitution解决办法

    环境Ubuntu18.4.02 脚本运行报错 # sh test.sh test.sh: 2: test.sh: Bad substitution 原因 从 ubuntu 6.10 开始,ubuntu ...