Python 中,单例模式的5种实现方式(使用模块、使用装饰器、使用类方法、基于new方法实现、基于metaclass方式实现)

单例模式的5种实现方式
1 使用模块
2 使用装饰器
3 使用类方法
4.基于new方法实现
5 基于metaclass方式实现

单例模式的5种实现方式

什么是单例模式?
单例模式是指:保证一个类仅有一个实例,并提供一个访问它的全局访问点# 线程1 执行:
cursor.excute('select * from user')# 线程2执行 
cursor.excute('select * from books')# 线程1 执行
cursor.fetchAll() # 拿出查询到的数据# django ,每个线程,一个连接对象---》 连接池

1 使用模块

其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当
第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。
因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。
如果我们真的想要一个单例类,可以考虑这样做:1.新建一个mysingleton.pyclass Singleton(object):def foo(self):passsingleton = Singleton()2.将上面的代码保存在文件 mysingleton.py 中,要使用时,直接在其他文件中导入此文件中的对象,
这个对象即是单例模式的对象:
from a import singleton

2 使用装饰器

   def Singleton(cls):instance = Nonedef _singleton(*args, **kargs):nonlocal instanceif not instance:instance = cls(*args, **kargs)return instancereturn _singleton@Singletonclass A(object):def __init__(self, x=0):self.x = xa1 = A(2)a2 = A(3)print(a1.x)print(a2.x)print(a1 is a2)  # True

回顾装饰器是什么


import time# 装饰器是什么?装饰器的作用是什么?
'''
装饰器是闭包函数的一个典型应用它是什么?在不改变函数源代码和调用方式idea基础上,为函数增加新功能
'''# def add(a, b):
#     time.sleep(2)
#     return a + bdef time_total(func):def inner(a, b):start = time.time()res = func(a, b)print('运行时间是:', time.time() - start)return resreturn inner# add = time_total(add)
# res = add(3, 4)
# print(res)@time_total  # 原理就是 add=time_total(add)
def add(a, b):time.sleep(2)return a + bres = add(3, 4)
print(res)
print(add.__name__)  # 就是inner# 什么是闭包函数?参数不是传进来的,是用了它上一层作用域范围的变量
'''1 定义在函数内部2 对外部作用域有引用(如果使用外部的可变类型,则直接使用;如果是不可变类型,需要使用nonlocal)例如:def add():a = 10def inner():nonlocal aa += 1print('闭包内部的值是:', a)  # 11inner()print('闭包外部的值是:', a)  # 11add()
'''

3 使用类方法

class Singleton(object):_instance=Nonedef __init__(self):pass@classmethoddef instance(cls, *args, **kwargs):if not cls._instance:cls._instance=cls(*args, **kwargs)return cls._instancea1=Singleton.instance()
a2=Singleton().instance()print(a1 is a2)

4 基于new方法实现

class Singleton(object):_instance=Nonedef __init__(self):passdef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance = object.__new__(cls)return cls._instanceobj1 = Singleton()
obj2 = Singleton()
print(obj1 is obj2)

5 基于metaclass方式实现


# 产生类这个对象的类,称之为元类
# 类中的 __call__什么时候回触发?对象()会触发
class SingletonType(type):_instance = Nonedef __call__(cls, *args, **kwargs):if not cls._instance:cls._instance = object.__new__(cls)cls._instance.__init__(*args, **kwargs)return cls._instanceclass Foo(metaclass=SingletonType):def __init__(self, name):self.name = nameobj1 = Foo('name')
obj2 = Foo('name')
print(obj1.name)
print(obj1 is obj2)  # True# __init__ 和 __new__ 区别是什么?
# 1 类()--->触发类中的__init__---->对象已经创建出来了,不能拦截住,做成单例了
# 2 类()----》触发类中的__new__----》真正的创建对象,判断之前有没有创建过,如果创建过,直接返回
# 3元类---》类()--->触发元类的__call__---》判断之前有没有创建过,如果有,直接返回

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

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

相关文章

王道计算机考研 操作系统学习笔记篇章二: 进程管理

目录 进程与线程 进程的概念 概念 进程的组成 PCB 程序段、数据段 进程的特征 总结 进程的状态与转换 进程的状态 创建态、就绪态 运行态 阻塞态 终止态 进程的转换 进程的组织 链接方式 索引方式 总结 进程控制 什么是进程控制 如何实现进程控制 进程控制相关的原…

SpringBoot整合WebSocket实战演练——Java入职十三天

前言 本文将介绍如何在Spring Boot应用程序中使用WebSocket实现服务端向客户端推送消息。Spring Boot和WebSocket的整合实现服务端向客户端推送消息,使得客户端能够实时接收并处理服务器发来的信息。WebSocket协议是一种双向通信的网络协议,使得客户端和服务器能够建立持久连…

pycharm远程连接miniconda完整过程,以及遇到的问题解决

问题1:no-zero exit code(126) env: ‘/home/user2/miniconda3/envs/ihan/bin/python3’: Too many levels of symbolic links Python interpreter process exited with a non-zero exit code 126 因为选择的新建导致太多软连接,先在服务器上建好虚拟环…

链式队列----数据结构

队列的基本概念 队列是一种操作受限的线性表(先进先出),只允许在队尾插入,队头删除。 例如去银行办理业务,肯定是先来的先出去,后来的人排在后方,只有第一个人业务办理完了,才会有…

使用Portainer图形化工具轻松管理远程Docker环境并实现远程访问

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 Portainer 是一个轻量级的容器管理工具,可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可…

策略模式——多重if-else解决方案

概念 大量的 if 判断操作,逻辑比较复杂,并且处理起来相对麻烦。可以采用策略模式来优化分支代码。 策略模式 💤:是一种行为设计模式,它允许你在运行时根据不同情况选择不同的算法或行为。 设计模式 🤌&…

solidworks 2024新功能之--保存为低版本 硕迪科技

大家期盼已久的SOLIDWORKS保存低版本文件功能来了,从SOLIDWORKS 2024 开始,您可以将在最新版本的SOLIDWORKS 中创建的SOLIDWORKS零件、装配体和工程图另存为SOLIDWORKS 早期版本的全功能文档(完成的特征树与相关参数)。 将文件另…

跟我一起写个虚拟机 .Net 7(三)- 安装LC-3 模拟器和编译器

LC-3(Little Computer 3) 是一门教学用的虚拟计算机模型,主要是为了方便学生了解简单化的计算机结构。 主要想学习《计算机系统概论》上的案例,基本都是通过LC-3 模拟器和LC-3编译器来的,所以,把安装的方式…

Kotlin中的逻辑运算符

在Kotlin中,逻辑运算符用于对布尔值进行逻辑运算。Kotlin提供了三个逻辑运算符:与运算(&&)、或运算(||)和非运算(!)。下面对这些逻辑运算符进行详细介绍,并提供示…

第1章 入门

当今,图形编程是基于着色器的,也就是说,有些程序是基于C或Java等标准程序语言编写的,并运行在中央处理器上(CPU);另一些是用专用的着色器语言编写的,直接运行在图形处理单元&#xf…

数据库管理-第111期 Oracle Exadata 02-硬件构成(20231017)

数据库管理-第111期 Oracle Exadata 02-硬件构成(202301017) 新开的坑,感觉一般般,还是坚持写下去吧。 1 过去和Exadata相关的博文 这里集合汇总一下之前写过的和Exadata相关的文章: 数据库管理-第三十七期 我搞挂了…

搜维尔科技:“虚实结合” 体验式人机验证技术,助力通用汽车开启研发新篇章

虚拟现实(VR)技术为制造业带来了巨大的可能性。它使工程师能够以真实世界的比例完整体验他们的设计,就像身临其境一样。通过在VR中模拟制造过程,可以发现并解决许多问题,从而避免在实际生产中投入大量资源后才发现问题。VR模拟使不同团队之间的沟通和协作变得比较直观和高效。这…

SystemVerilog Assertions应用指南 Chapter1.34 :SVA中的多时钟定义

SVA允许序列或者属性使用多个时钟定义来采样独立的信号或者子序列。SVA会自动地同步不同信号或子序列使用的时钟域下面的代码显示了一个序列使用多个时钟的简单例子。 sequence s_multiple_clocks;(posedge clk1) a ##1 (posedge clk2) b; endsequence 序列 s_multiple_clocks…

解决方案|智能制造升级,汽车行业借力法大大电子签进入“快车道”

《“十四五”智能制造发展规划》明确智能制造是制造强国建设的主攻方向,其发展程度直接关乎我国制造业质量水平。发展智能制造对于巩固实体经济根基、建成现代化产业体系、实现新型工业化具有重要作用。 规划明确指出要深入实施智能制造工程,着力提升创…

零基础如何学习自动化测试

现在很多测试人员有些急于求成,没有任何基础想当然的,要在一周内上手自动化测试。 在自动化的过程中时候总有人会犯很低级的问题,有语法问题,有定位问题,而且有人居然连__init__.py 文件名都弄错误,还有将…

【LeetCode】 412. Fizz Buzz

题目链接 文章目录 Python3 【O(n) O(1)】C.emplace_back() 【C 11 之后】 Python3 【O(n) O(1)】 初始版本 class Solution:def fizzBuzz(self, n: int) -> List[str]:ans []for i in range(1, n1):if i % 5 0 and i % 3 0:ans.append("FizzBuzz")elif i % …

AutoSar 学习路线

1 获取Spec 如何获取Autosar SPEC文档? 从官网获取最新的规范文档,网址:https://www.autosar.org/standards。 如果浏览器拦截, 点开高级, 点击继续访问即可。 Autosar 分Classific 和 Adaptive Platform. AUTOSAR分…

Kotlin中的函数定义

在 Kotlin 中,函数是一种重要的语言特性,它用于封装可重复使用的代码块。在本篇博客中,我们将介绍 Kotlin 函数的定义方式,并提供示例代码演示不同类型的函数。 首先,让我们来看一下函数的基本组成部分: …

深度学习(12)之模型训练[训练集、验证集、过拟合、欠拟合]

模型训练[训练集、验证集、过拟合、欠拟合] 在不断补充训练数据集的过程中,发现纯粹增加数据集并不会使得模型效果单向地变好,如果是多目标检测模型的话,常会出现精度变低的现象本文想总结在模型训练时的一些注意事项,比如训练集…

07 创建型模式-单例模式

1.单例模式介绍 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,此模式保证 某个类在运行期间,只有一个实例对外提供服务,而这个类被称为单例类。 2.使用单例模式要做的两件事 保证一个类只有一个实例…