python之单例设计模式
时间:2022-07-23
本文章向大家介绍python之单例设计模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
所谓单例,就是让类创建对象的时候,在系统中只有唯一的一个实例。
(1)定义一个类属性,初始值是None,用于记录单例的引用。
(2)重写__new__方法。
(3)如果类属性是None,调用父类方法分配空间,并在属性中记录结果。
(4)返回属性中记录的对象引用。
class MusicPlayer(object):
instance = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
print("创建对象,分配空间")
cls.instance = super().__new__(cls)
return cls.instance
def __init__(self):
print("播放器初始化")
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)
输出:
我们发现,对象只被创建了一次,当要再创建一个对象时,实际上调用的是已经存在的同一个对象,均是唯一的地址, 但是,我们发现初始化操作却被执行了两次,这不符合我们的要求,解决办法如下:
(1)定义一个类属性init_flag标记是否执行过初始化操作,初始值为False。
(2)在__init__方法中判断是否进行过初始化,如果执行了,将init_flag置为True。
(3)再次调用__init__时,初始化就不会被执行了。
class MusicPlayer(object):
instance = None
init_flag = False
def __new__(cls, *args, **kwargs):
if cls.instance is None:
print("创建对象,分配空间")
cls.instance = super().__new__(cls)
return cls.instance
def __init__(self):
if not MusicPlayer.init_flag:
print("播放器初始化")
MusicPlayer.init_flag = True
else:
return
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)
输出:
- python重试(指数退避算法)
- 动手为王 | Oracle 数据库跨版本升级迁移实践
- 日志归档与数据挖掘
- Redis实现分布式锁
- Mybatis分页插件PageHelper的配置和使用方法
- 另类保存微信公众平台历史消息的方法 - 星标消息
- CentOS环境下Docker私有仓库搭建
- spark三种连接join
- 用firebug给firefox添加信任链接
- Elasticsearch索引别名、Filtered索引别名、Template
- 追本溯源:Oracle 只读表空间的探索实践
- firefox查看微信公众平台的数据分析时就出现不信任链接怎么办?
- spark-streaming集成Kafka处理实时数据
- 使用spark与MySQL进行数据交互的方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 创建对象的几种方法及优缺点
- 【Rust日报】2020-10-02 移动操作系统SailfishOS支持Rust了
- Git
- 网络协议
- 【crossbeam系列】5 crossbeam-util和crossbeam-queue:一些实用的小东西
- 数据结构
- 静态博客自动化部署教程
- 【每周一库】 Sincere - a micro web framework for Rust
- 小米路由器 HD(R3D) 折腾笔记
- Deepin 系统科学上网 PAC 自动代理
- 十分钟快速搭建内网穿透工具 —— frp
- 精选25道Mysql面试题,快来测测你的数据库水平吧
- Flask基础入门学习笔记-1
- WSL 下优雅地 Coding
- Python3补充知识点