当前位置: 首页 > news >正文

python实现单例模式及其应用

单例模式是一种常见的设计模式,它保证一个类只能被实例化一次,并提供了一个全局访问点来获取这个唯一的实例。

在 Python 中,可以通过使用装饰器、元类或模块等方式实现单例模式。下面分别介绍这三种方法:

1.使用装饰器实现单例模式

def singleton(cls):instances = {}def wrapper(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return wrapper@singleton
class MyClass:passa = MyClass()
b = MyClass()
print(a is b)  # True

解析:
上述代码中,我们定义了一个名为 singleton 的装饰器,它接受一个类作为参数。在装饰过程中,我们定义了一个字典 instances 来保存实例化后的对象。然后,我们使用闭包来创建一个内部函数 wrapper,它接受任意数量的位置参数和关键字参数。在 wrapper 函数内部,我们首先判断该类是否已经存在于 instances 字典中,如果不存在,则创建一个新的实例并将其添加到 instances 字典中,否则返回已有的实例。

最后,我们使用 @singleton 装饰器来修饰类 MyClass,使其成为一个单例类。当我们实例化两个 MyClass 对象时,它们实际上是同一个对象,因此 a is b 的结果为 True。

2.使用元类实现单例模式

class SingletonMeta(type):instances = {}def __call__(cls, *args, **kwargs):if cls not in cls.instances:cls.instances[cls] = super().__call__(*args, **kwargs)return cls.instances[cls]class MyClass(metaclass=SingletonMeta):passa = MyClass()
b = MyClass()
print(a is b)  # True

解析:
上述代码中,我们定义了一个名为 SingletonMeta 的元类。在元类的 __call__ 方法中,我们首先判断该类是否已经存在于 instances 字典中,如果不存在,则创建一个新的实例并将其添加到 instances 字典中,否则返回已有的实例。

最后,我们使用 metaclass 参数来指定元类为 SingletonMeta,使得类 MyClass 成为一个单例类。当我们实例化两个 MyClass 对象时,它们实际上是同一个对象,因此 a is b 的结果为 True。

3.使用模块实现单例模式

# module.py
class MyClass:passmy_singleton = MyClass()

解析:
上述代码中,我们定义了一个名为 MyClass 的类,并在模块级别上实例化了一个对象 my_singleton。由于 Python 中每个模块只会被导入一次,因此 my_singleton 对象也只会被实例化一次,从而实现了单例模式。

当我们需要使用 my_singleton 对象时,只需导入该模块即可:

from module import my_singletona = my_singleton
b = my_singleton
print(a is b)  # True

4.应用场景

单例模式适用于需要确保一个类只有一个实例对象,并且该对象需要被全局访问的情况。下面是一个实际的例子。

假设我们正在开发一个多线程的应用程序,其中包含一个数据库连接池对象。为了避免在多个地方重复创建数据库连接池对象,我们可以使用单例模式来确保该对象只会被创建一次,并且在多个线程之间共享同一个对象。具体实现代码如下:

import threadingclass DatabaseConnectionPool:instance = Nonelock = threading.Lock()def __new__(cls):if not cls.instance:with cls.lock:if not cls.instance:cls.instance = super().__new__(cls)return cls.instancedef __init__(self):self.connections = []def add_connection(self, connection):self.connections.append(connection)def get_connection(self):return self.connections.pop()# 使用示例
pool = DatabaseConnectionPool()
pool.add_connection("connection1")
pool.add_connection("connection2")def worker():pool = DatabaseConnectionPool()  # 多个线程都共享同一个对象connection = pool.get_connection()print(f"Thread-{threading.get_ident()} got connection: {connection}")for i in range(4):t = threading.Thread(target=worker)t.start()

上述代码中,我们首先定义了一个名为 DatabaseConnectionPool 的单例类,它维护了一个连接池列表 connections,通过 add_connection 和 get_connection 方法来添加和获取连接。使用 __new__ 方法来创建单例对象,确保在多个线程之间只有一个实例,同时使用锁来保证线程安全。

然后,我们在多个线程中使用同一个连接池对象,并通过 get_connection 方法来获取连接。由于所有的线程都共享同一个连接池对象,因此在获取连接时不会出现资源浪费和重复创建对象等问题。

相关文章:

python实现单例模式及其应用

单例模式是一种常见的设计模式,它保证一个类只能被实例化一次,并提供了一个全局访问点来获取这个唯一的实例。 在 Python 中,可以通过使用装饰器、元类或模块等方式实现单例模式。下面分别介绍这三种方法: 1.使用装饰器实现单例…...

SSM 如何使用 Seata 框架实现分布式事务?

SSM 如何使用 Seata 框架实现分布式事务? 分布式事务是现代分布式系统中必不可少的一部分,而 Seata 框架是一种常用的分布式事务处理方式。在 SSM 框架中,我们可以使用 Seata 框架来管理分布式事务。本文将介绍如何在 SSM 框架中使用 Seata …...

FreeRTOS任务相关API函数

任务创建和删除API函数 xTaskCreate() 创建任务。RAM BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //任务函数const char* const pcName, //任务名字const uint16_t usStackDepth,//任务堆栈大小void * const …...

VBA之正则表达式(42)-- 提取代码中变量名称

实例需求:待处理代码段如下所示,现在需要提取其中的变量名称。 Public pFactor As Integer Sub TestCode() Dim reg As New RegExp, a As Workbook Dim ms As VBScript_RegExp_55.MatchCollection Dim m As VBScript_RegExp_55.Match Dim i, j Dim x1, y…...

Unity Lightmapping Setting

如下图: Lightmapper: 使用什么硬件或算法渲染 Progressive CPU、Progressive GPU、Enlighten(新的算放目前用的比较少) 此数值会被用于分别乘以Direct Samples,Indirect Samples和Environment Samples这三个数值。这三个数值会被应用于…...

Android 12.0Camera2 静音时拍照去掉快门声音

1.概述 在12.0定制化开发时,在Camera2静音情况下有快门拍照声音,这就不符合使用规范了 静音的情况下拍照也不应该发出声音,所以在静音拍照流程中要求去掉快门声音 2.Camera2静音拍照去掉快门声音核心代码 Camera2拍照主要代码:/packages/apps/Camera2/src/com/android/cam…...

Win11硬盘分区

电脑重装了Win11系统,按WinE打开主文件夹,再点击此电脑,发现: 磁盘只有一个C盘。硬盘的所有空间都在该盘上了,那么我们怎么将其分区呢? Win11硬盘分区步骤: 步骤1: 按WinR输入dis…...

访客管理系统:Lobby Track Crack

Lobbytrack桌面 for 微软视窗 一个强大的、功能齐全的现场访客管理系统解决方案。在本地管理您的数据,网络工作站一起配置访客管理流程的各个方面。 扩展您的系统将本地 Web 模块 添加到您的 Lobbytrack 桌面系统,并允许您的员工使用本地 Intranet 上的 …...

Lidar AI Solution环境配置

目录 Lidar AI Solution环境配置前言1. Lidar AI Solution1.1 Pipeline overview1.2 GetStart 2. CUDA-BEVFusion2.1 3D目标检测(nuScenes验证集)2.2 演示2.3 模型和数据2.4 前置条件2.5 快速开始推理2.5.1 下载模型和数据到CUDA-BEVFusion文件夹2.5.2 配置environment.sh2.5.3…...

子串--子字符串 0528

210102 201012 A1A2…An An…A2A1 如何做, 翻转的是21,因为2>1; 翻转的是210,因为2>0; 翻转的是2101,因为2>1; 翻转的是21010,因为2>0; 翻转的是210102,因为22且1&…...

大数据教程【01.04】--excel的使用

更多信息请关注WX搜索GZH:XiaoBaiGPT Excel中的大数据处理 Excel是一款功能强大的电子表格软件,它广泛用于数据处理和分析。对于大数据处理,Excel提供了多种功能和工具,可以帮助用户处理大量的数据。在本教程中,我们…...

Java输入输出流

目录 一、数据流概念 1.输入输出的概念​ 2.流的概念 3.流的操作 二、常用的流分类 三、文件输入输出流 1.FileReader和FileWriter 2.FileInputStream和FileOutStream 四、复制文件 一、数据流概念 1.输入输出的概念​ 输入输出技术用于处理设备之间的数据传输&#x…...

1688商品ID采集一件代发详情页面数据

本篇博文介绍了对1688商品详情API的二次封装,将URL参数封装成Python函数,直接传入参数即可获取搜索结果,例如1688商品标题、价格、一件代发、sku属性和URL等。提供了详细的代码示例和接口调用Demo。 1688.item_get-获得1688商品详情数据 1.请…...

丽江“美丽县城”建设,高精度地籍免像控案例分享

一、项目背景 云南省地矿测绘院于2020年6月承接丽江市玉龙县“美丽县城”建设项目1:500倾斜摄影及地形图测绘项目。项目要求对玉龙县城区及其周边等约30平方公里区域进行优于3CM倾斜摄影测量。 并基于三维模型完成地形高程点、地貌、地物特征点的采集成图&#xf…...

我是如何精通软件工程的

软件工程是一个庞大且不断演化的领域,涉及许多创新。虽然如此,大多数技术 —— 如果不是全部 —— 在软件工程中往往最终汇聚为几个基本原则。工程师更好地掌握软件工程的方法是熟悉软件工程的基础知识,而不是那些不断变化的框架、语言或平台…...

如何使用 Python Nornir 实现基于 CLI 的网络自动化?

在现代网络环境中,网络自动化已成为管理和配置网络设备的重要工具。Python Nornir 是一个强大的自动化框架,它提供了一个简单而灵活的方式来执行网络自动化任务。本文将详细介绍如何使用 Python Nornir 实现基于 CLI 的网络自动化。 1. Python Nornir 概…...

并发编程的三大特性之有序性

有序性的概念 Java文件在被cpu执行前会进行编译成cpu可以执行的指令,为了提高cpu的执行效率会对其中的一些语句进行重排序。Java指令最终是乱序执行的目的是为了提高cpu的执行效率,发挥cpu的性能 单例模式由于指令重排可能会出现上述的问题&#xff0…...

LeetCode:相交链表(java)

相交链表 题目描述指针法解题 #LeetCode 160题:相交链表,原题链接 原题链接。相交链表–可以打开测试 题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返…...

利用PHP导出MySQL数据表结构和SQL文件

目录 一、获取数据库所有的数据表 方法一:TP5 方法二:原生PHP 二、导出指定数据表的数据结构 三、 导出SQL文件 四、生成SQL语句 五、完整代码 前端 后端 语言:PHP 数据库:MySQL 功能:分为四部分,① 查出数…...

接口测试框架分析

框架大体上已经写完了,不过说实话好多代码让我自己写我也写不出来,那该怎么办呢?很简单,把现在已经写好的代码保存起来,等用的时候拿出来复制粘贴就好了,如果你是大神,自己会写,那就…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

数据库分批入库

今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

腾讯云V3签名

想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...

Shell 解释器​​ bash 和 dash 区别

bash 和 dash 都是 Unix/Linux 系统中的 ​​Shell 解释器​​,但它们在功能、语法和性能上有显著区别。以下是它们的详细对比: ​​1. 基本区别​​ ​​特性​​​​bash (Bourne-Again SHell)​​​​dash (Debian Almquist SHell)​​​​来源​​G…...