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 ...
随机推荐
- 深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战
一.VisualVM是什么? VisualVM是一款免费的JAVA虚拟机图形化监控分析工具. 1. 拥有图形化的监控界面. 2. 提供本地.远程的JVM监控分析功能. 3. 是一款免费的 ...
- ssm 项目记录用户操作日志和异常日志
借助网上参考的内容,写出自己记录操作日志的心得!! 我用的是ssm项目使用aop记录日志:这里用到了aop的切点 和 自定义注解方式: 1.建好数据表: 数据库记录的字段有: 日志id .操作人.操作 ...
- Leet Code 2.两数相加
2.两数相加 题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- embeding 是什么
要搞清楚embeding先要弄明白他和one hot encoding的区别,以及他解决了什么one hot encoding不能解决的问题,带着这两个问题去思考,在看一个简单的计算例子 以下引用 Y ...
- composer.lock文件的作用
在使用composer后目录中会出现2个文件,composer.lock和composer.json,现在来说说这两个文件的作用. 1.composer.json composer.json文件中保存 ...
- No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? idea maven 打包报错问题解决
mvn clean install -X -Dmaven.test.skip=true -P dev 打包报错:No compiler is provided in this environment. ...
- SQLServer stuff函数
STUFF ( character_expression , start , length ,character_expression ) 参数 character_expression 一个字符数据 ...
- B2B2C 商业模式
b2b2c_百度百科https://baike.baidu.com/item/b2b2c/876805 What is Business to Business to Consumer (B2B2C) ...
- composer Changed current directory to没反应
根据官方手册执行composer global require "laravel/installer" 显示Changed current directory to C:/User ...
- (待续)【转载】 DeepMind发Nature子刊:通过元强化学习重新理解多巴胺
原文地址: http://www.dataguru.cn/article-13548-1.html -------------------------------------------------- ...