python的单例模式详解
一、什么是单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场
比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。
单例设计模式:
**目的:**让类创建的对象,在系统只执行唯一实例,即每一次执行类名.()返回的对象,内存地址是相同的,可以通过id(实例对象)来查看实例对象对应的内存空间地址。
应用场景: 音乐播放器、回收站对象、打印机对象…
二、通过装饰器实现单例模式
面试真题:
通过装饰器实现单例模式,只要任意一个类使用该装饰器装饰,
那么就会变成一个单例模式的类。
1.用函数方法实现:
def single(cls):cls.instance = Nonedef wrapper(*args, **kwargs):# 判断类是否有instance属性if not cls.instance:# 通过类创建对象,并保存为instance属性cls.instance = cls(*args, **kwargs)# 返回对象return cls.instancereturn wrapper
@single # A = single(A)
class A:pass
a1 = A()
a2 = A()
print(a1, a2)
运行结果:
<__main__.A object at 0x000001F125DE2D60> <__main__.A object at 0x000001F125DE2D60>
2.通过类来实现:
class single1:def __init__(self, cls):self.cls = clsself.cls.instance = Nonedef __call__(self, *args, **kwargs):if not self.cls.instance:self.cls.instance = self.cls(*args, **kwargs)return self.cls.instance
@single1
class B:pass
b1 = B()
b2 = B()
print(b1, b2)
运行结果:
<__main__.B object at 0x000001F125DE2DC0> <__main__.B object at 0x000001F125DE2DC0>
三、基于基于__new__方法实现
__new__方法:
使用类名()创建对象时,python的解释器首先会调用__new__方法为对象分配空间,然后在执行__init__初始话实例对象。
object提供的__new__静态方法,主要有2个作用:
- 在内存中为对象分配空间
- 返回对象的引用
Python解释器获取对象的引用后,将引用作为第一个参数,传递给__init__方法
注意点:
重写__new__方法一定要return super().new(cls), 否则python解释器得不到分配空间引用,就不会调用对象的初始化
__new__是一个静态方法,在调用时需要主动传递cls函数。
代码实现:
class A(object):__instance = Nonedef __new__(cls, *args, **kwargs):if cls.__instance is None:cls.__instance = super().__new__(cls)return cls.__instanceelse:return cls.__instancea1 = A()
a2 = A()
print("a1的id为:", id(a1))
print("a2的id为:", id(a2))
print("a1 is a2:", a1 is a2)
print(a1)
print(a2)
运行结果:
a1的id为: 2168943480688
a2的id为: 2168943480688
a1 is a2: True
<__main__.A object at 0x000001F8FF1B0F70>
<__main__.A object at 0x000001F8FF1B0F70>
解析如下:
目的: 让类创建的对象,在系统中只有唯一的一个实例
流程:
定义一个类属性,初始值是None, 用于记录单例对象的引用。
重写__new__方法
如果类属性is None,调用父类方法分配空间,并在类属性中记录结果
返回类属性中记录的对象引用。
python的单例模式详解相关推荐
- python单例模式解析_Python下简易的单例模式详解
Python 下的单例模式 要点: 1.某个类只能有一个实例: 2.它必须自行创建这个实例: 3.它必须自行向整个系统提供这个实例 方法:重写new函数 应该考虑的情况: 1.这个单例的类可能继承了别 ...
- Python 装饰器详解(中)
Python 装饰器详解(中) 转自:https://blog.csdn.net/qq_27825451/article/details/84581272,博主仅对其中 demo 实现中不适合pyth ...
- python20191031_20191031:Python取反运算详解
20191031:Python取反运算详解 取反运算:~3 == 4 1.对于数字 3 =======>转换为二进制表示为011 2.对011取反为100 3.为什么表示-4 a.计算机用补码表 ...
- Python字符编码详解
Python字符编码详解 转自http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html Python字符编码详解 本文简单介绍了各种常用的 ...
- python的执行过程_在交互式环境中执行Python程序过程详解
前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...
- windows上安装Anaconda和python的教程详解
一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...
- python变量类型-Python 变量类型详解
变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整 ...
- python安装教程windows-windows上安装Anaconda和python的教程详解
一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...
- python语言编程基础-Python语言入门详解!快速学成Python!
原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...
最新文章
- OKR落地的四个基本因素是什么?
- 数据分析工具Pandas(3):Pandas的对齐运算
- java通过使用ffmpeg获取视频的码率
- 7-4 递增序列 (15 分)
- 1009. clion调试段错误
- Volley源码学习2--cache类
- 幅度和幅值有区别吗_16G内存够用吗?8G/16G/32G内存横向对比
- tensorflow之argmax与axis
- div 一段时间后自动隐藏
- 海康rtsp视频流媒体服务器搭建(去除flash插件):rtsp > nginx-rtmp > http-flv > flv.js
- 如何将ts文件转为mp4格式
- ❤️ 硬核玩游戏:200行代码给你整个俄罗斯方块 ❤️
- 苹果开发者账号的申请
- 2014年大数据解决方案提供商面临三大挑战
- 麦客CEO李卉:实践证明肯钻营的“小而美”亦动人|企服三会系列报道
- webservice:com.sun.xml.internal.ws.server.ServerRtException: [failed to localize]
- Android:检查通知权限并跳转到通知设置界面
- 赠书福利|一本书是写给美国人看的书,告诉我们,美国科技为什么领先?
- Windows桌面图标被白块挡住大部分
- 《hadoop进阶》web日志系统 KPI指标的分析与实现