09 单例设计模式、__new__函数
设计模式
- 设计模式是前任工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对某一特定问题的成熟的解决方案。
- 使用设计模式是为了可重用代码、让代码更容易的被他人理解、保证代码的可靠性。
单例设计模式
- 单例即指只有一个实例
- 目的:让该类创建的对象,在系统中只有一个实例
- 每一次创建此类的对象,内存地址都是相同的
单例设计模式的应用场景
- 音乐播放 对象
- 回收站对象
- 打印机对象
- 。。。
__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__函数的更多相关文章
- Java面向对象 Main函数 静态的应用 单例设计模式
Java面向对象 Main函数 静态的应用与单例设计模式 知识概要 (1)Main函数的细解 (2)静态的应用,静态变量,静态代码块,静态函数 (3)单例设计模式 1.M ...
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...
- Python中的单例设计模式
1)设计模式: 是前人工作的总结和提炼.通常,被人们广泛流传的设计模式. 某一问题的特定解决方案,使用设计模式是为了可重用代码,是代码更容易被人理解, 增加代码的可用性. 2)单例设计模式: ...
- Python——单例设计模式
单例设计模式: 让类创建的对象,在系统中只有唯一的实例, 使用python类内置的__new__()方法实现,__new__()方法在创建对象时会被自动调用,通过重写__new__()方法,使得无论用 ...
- java笔记之静态修饰附和单例设计模式
第六天笔记 静态修饰符static: 一.static修饰成员变量: static用来修饰成员变量叫静态成员变量,没有static修饰的成员变量叫非静态成员变量 静态成员的访问方式: (1) 用 ...
- python之单例设计模式
设计模式之单例模式 单例设计模式是怎么来的?在面向对象的程序设计中,当业务并发量非常大时,那么就会出现重复创建相同的对象,每创建一个对象就会开辟一块内存空间,而这些对象其实是一模一样的,那么有没有办法 ...
- IOS中的单例设计模式
单例设计模式是IOS开发中一种很重要很常用的一种设计模式.它的设计原理是无论请求多少次,始终返回一个实例,也就是一个类只有一个实例.下面是苹果官方文档中关于单例模式的图片: 如图所示,左边的图是默认的 ...
- JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖
JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有 ...
- python小总结3(异常、单例设计模式)
一.异常 AttributeError:试图访问一个对象没有的成员[属性和方法] ValueError:值错误,传入了一个不期望的值 ImportError:无法导入模块或者包:基本上路径问题 Ind ...
随机推荐
- expdp导出卡住问题诊断
本文链接:https://blog.csdn.net/guogang83/article/details/78800487 [oracle@database ~]$nohup expdp gg/gg ...
- Android智能手机上的音频浅析【转】
本文转载自:https://blog.csdn.net/david_tym/article/details/80903385 手机可以说是现在人日常生活中最离不开的电子设备了.它自诞生以来,从模拟的发 ...
- [Java/File]读取日文CSV文件不乱码
try { StringBuilder sb=new StringBuilder(); sb.append("\nContent in File:'"+filePathname+& ...
- futex的设计与实现
介绍 futex(快速用户空间互斥)是Linux的一个基础组件,可以用来构建各种更高级别的同步机制,比如锁或者信号量等等,POSIX信号量就是基于futex构建的.大多数时候编写应用程序并不需要直接使 ...
- PHP实现执行定时任务
首先用命令检查服务是否在运行 systemctl status crond.service 如果服务器上没有装有crontab ,则可以执行 yum install vixie-cron yum in ...
- android: Android水波纹点击效果
Android API 21及以上新增了ripple标签用来实现水波纹的效果.我们可以通过设置ripple背景来实现一些View点击效果. 该水波纹效果有两种:一种是有界的(点击后类似于一个矩形向四周 ...
- mybatis pagehelper 分页 失效
pagehelper 不分页几种情况的解决方法 - web洋仔 - CSDN博客https://blog.csdn.net/csdn___lyy/article/details/77160488 分页 ...
- layui的table中日期格式转换
我使用的layui的2.4.5版本,在util中已经带了格式转换的函数.这里主要记录如何使用. 未使用前在table中显示如下: 前端代码如下: {field:'createDate', title: ...
- Centos7 卸载 Nginx 并重新安装 Nginx
1) 卸载nginx [root@locahost /]# yum remove nginx 2) 查看nginx是否还存在 [root@localhost /]# which nginx 3)重新 ...
- vmware配置双网卡
最近在学习使用iptables做网关服务器,即SNAT设置 我们的宿主机有两块网卡,地址分别是: 192.168.6.108/24 192.168.66.119/24 我们的目标是在虚拟机VMware ...