【Python基础】 Python设计模式之单例模式介绍

0

单例模式

  • 1.设计模式
  • 2.单例设计模式的应用场景
  • 3.new方法
  • 4. Python 中的单例

1.设计模式

  • 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案
  • 使用 设计模式 是为了可重用代码、让代码更容易被他人理解、保证代码可靠性,可扩展性很好
  • 单例设计模式
    – 目的 —— 让 类 创建的对象,在系统中 只有唯一的一个实例
    – 每一次执行类名() 返回的对象,内存地址是相同的

2.单例设计模式的应用场景

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

3.new方法

• 使用 类名() 创建对象时,Python 的解释器 首先 会调用 new 方法为对象分配空间
• new 是一个由object 基类提供的 内置的静态方法,主要作用有两个:
– 1) 在内存中为对象 分配空间
– 2) 返回 对象的引用
• Python 的解释器获得对象的 引用 后,将引用作为 第一个参数,传递给
init 方法
重写 new 方法的代码非常固定!
• 重写 new 方法 一定要 return super(). new (cls)
• 否则Python 的解释器 得不到 分配了空间的 对象引用,就不会调用对象的初始化方法
• 注意: new 是一个静态方法,在调用时需要 主动传递 cls 参数
001

#!/usr/bin/python
# author X_Dragon
# E-mail:3270895551@qq.com
class MusicPlayer(object):def __new__(cls, *args, **kwargs):# 创建对象是,new方法会被自动调用print("创建对象 分配空间")# 2.为对象分配空间isinstance=(super().__new__(cls))# 3.返回对象的引用return isinstancedef __init__(self):print("播放器初始化")
player =MusicPlayer()print(player)

4. Python 中的单例

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

class MusicPlayer(object):#定义类的属性记录单例对象引用isinstance=Nonedef __new__(cls, *args, **kwargs):# 1.判断类属性是否已经被赋值if(cls.isinstance is None):cls.isinstance=super().__new__(cls)# 2.返回类属性的单例引用`return  cls.isinstance

只执行一次初始化工作
• 在每次使用类名() 创建对象时,Python 的解释器都会自动调用两个方法:
– new 分配空间

– init 对象初始化
• 在上一小节对 new 方法改造之后,每次都会得到 第一次被创建对象的引用
• 但是:初始化方法还会被再次调用需求
• 让 初始化动作 只被 执行一次

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

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

相关阅读:
链接: Python实现单例模式的5种方法

0004

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/136747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt】QPalette

2023年11月10日,周五上午 Palette意为“调色板”。 QPalette是Qt中用于管理控件调色板(颜色方案)的类。它允许你为Qt应用程序中的控件设置不同的颜色,以满足视觉设计需求。 QPalette可以管理各种控件的颜色属性,如前…

python解析xmind统计测试用例/测试点 个数及执行情况

前言:统计的是每个分支最后一个节点的状态 xmind版本 23.0911172 标记打开位置 标记规则如下 解释: res {"total": 0, "pass": 0, "fail": 0, "no_result": 0, "unfinished": 0, "now_fail…

mysql用户及权限管理(InsCode AI 创作助手)

MySQL是一个广泛使用的开源关系型数据库管理系统,用于存储和管理大量数据。对于那些需要使用MySQL的管理员和开发人员来说,用户权限管理是确保数据库安全性的至关重要的一环。在本篇技术博客中,我们将深入探讨MySQL的用户权限管理&#xff0c…

深度学习检测小目标常用方法

前言 在深度学习目标检测中,特别是人脸检测中,小目标、小人脸的检测由于分辨率低,图片模糊,信息少,噪音多,所以一直是一个实际且常见的困难问题。不过在这几年的发展中,也涌现了一些提高小目标…

❤ Uniapp使用Ucharts(二)(组件类型)

❤ Uniapp使用Ucharts&#xff08;二&#xff09;&#xff08;秋云组件类型&#xff09; 一、折线图 1、结构 <template><view class"charts-box"><qiun-data-charts type"area":opts"opts":chartData"chartData"/&…

机器/深度学习模型最优化问题详解及优化算法汇总

前言 其实最优化问题&#xff0c;从小学开始学习数学的时候就可以说已经接触到了&#xff0c;在我印象中有个问题&#xff0c;用一个平底锅煎饼&#xff0c;每次只能放2只饼&#xff0c;煎一只饼要2分钟&#xff08;正反各用1分钟&#xff09;&#xff0c;煎三只饼要几分钟。这…

C语言--汉诺塔【内容超级详细】

今天与大家分享一下如何用C语言解决汉诺塔问题。 目录 一.前言 二.找规律⭐ 三.总结⭐⭐⭐ 四.代码实现⭐⭐ 一.前言 有一部很好看的电影《猩球崛起》⭐&#xff0c;说呀&#xff0c;人类为了抗击癌症发明了一种药物&#x1f357;&#xff0c;然后给猩猩做了实验&#xff0…

【Java】I/O流—缓冲流的基础入门和文件拷贝的实战应用

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;你能坚持到什么程度&#xff0c;决定你能达到什么高度 &#x1f4e2;欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 文章目录 一.&…

聊聊logback的TimeBasedRollingPolicy

序 本文主要研究一下logback的TimeBasedRollingPolicy TimeBasedRollingPolicy public class TimeBasedRollingPolicy<E> extends RollingPolicyBase implements TriggeringPolicy<E> {static final String FNP_NOT_SET "The FileNamePattern option must…

EMQX ECP 2.0 工业互联数据平台产品发布会

在工业企业数字化、智能化转型的过程中&#xff0c;上层创新应用需要高质量数据来驱动。然而&#xff0c;许多工业企业都面临一系列数据层面的挑战&#xff0c;如数据碎片化、数据处理延迟、以及数据质量不一等等。 当下&#xff0c;依托软件定义制造、数据互通、人工智能驱动…

基于springboot实现福聚苑社区团购平台系统项目【项目源码】

基于springboot实现福聚苑社区团购平台系统演示 Javar技术 Java是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&…

git增加右键菜单

有次不小心清理系统垃圾&#xff0c;把git右击菜单搞没了&#xff0c;下面是恢复方法 将下面代码存为.reg文件&#xff0c;双击后导出生效&#xff0c;注意&#xff0c;你安装的git必须是默认C盘的&#xff0c;如果换了地方要改下面注册表文件中相关的位置 Windows Registry …

Windows搭建minio存储

minio功能类似以ftp 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.下载软件 https://dl.min.io/server/minio/release/windows-amd64/minio.exe 2.部署配置 我是在D盘下创建了minio目录 minio.exe是软件minio.log是日志&#xff08;不用创建&#xff09;minio900…

骑士巡游问题

一、骑士巡游问题 题目描述&#xff1a;骑士在8*8的国际象棋棋盘上进行巡游&#xff0c;当指定骑士出发的位置后&#xff08;x,y&#xff09;&#xff0c;能输出骑士遍历棋盘的所有路径坐标。 输出效果&#xff1a; 代码&#xff08;请在visual stdio下运行&#xff0c;Dev-C…

虚幻引擎:如何进行关卡切换?

一丶非无缝切换 在切换的时候会先断开连接,等创建好后才会链接,造成体验差 蓝图中用到的节点是 Execute Console Command 二丶无缝切换 链接的时候不会断开连接,中间不会出现卡顿,携带数据转换地图 1.需要在gamemode里面开启无缝漫游,开启之后使用上面的切换方式就可以做到无缝…

Scala中编写多线程爬虫程序并做可视化处理

在Scala中编写一个爬虫程序来爬取店铺商品并进行可视化处理&#xff0c;需要使用Selenium和Jsoup库来操作网页。在这个例子中&#xff0c;我们将使用多线程来提高爬取速度。 1、首先&#xff0c;我们需要引入所需的库&#xff1a; import org.openqa.selenium.By import org.o…

Milvus Cloud——Agent 框架工作方式

Agent 框架工作方式 我们以 AutoGPT 为例&#xff0c;看看一个 Agent 框架具体是如何工作的&#xff1a; AutoGPT[2] 使用 GPT-4 来生成任务、确定优先级并执行任务&#xff0c;同时使用插件进行互联网浏览和其他访问。AutoGPT 使用外部记忆来跟踪它正在做什么并提供上下文&am…

软文推广中如何搭建媒体矩阵

媒体矩阵简单理解就是在不同的媒体平台上&#xff0c;根据运营目标和需求&#xff0c;建立起全面系统的媒体布局&#xff0c;进行多平台同步运营。接下来媒介盒子就来和大家聊聊&#xff0c;企业在软文推广过程中为什么需要搭建媒体矩阵&#xff0c;又该如何搭建媒体矩阵。 一、…

Python基础教程之十九:Python优先级队列示例

1.什么是优先队列 优先级队列是一种抽象数据类型&#xff0c;类似于常规队列或堆栈数据结构&#xff0c;但每个元素还具有与之关联的“优先级”。在优先级队列中&#xff0c;优先级高的元素先于优先级低的元素提供。如果两个元素具有相同的优先级&#xff0c;则将根据其在队列…

安防监控EasyCVR视频汇聚平台无法接入Ehome5.0是什么原因?该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放…