零基础小白Python入门必看:设计模式之单例模式

python使用单例模式创建MySQL链接 上一篇文章python通过跳板机连接MySQL中,实现了通过跳板机访问MySQL,在实际项目中,可能会在多个不同的方法中使用MySQL链接,如果每次都新建、关闭连接,当访问量高时可能会造服务器崩溃无法访问等问题,而单例模式可以很好的解决这个问题。关于python的单例模式这篇文章有详细的例子,这里我们使用方法4,因为这种方法更加pythonic。代码如下:from functools import... 阅读详情

 

一、单例模式存在的意义

  在这里的单例就是只有一个实例(这里的实例就像在面向对象的时候,创建了一个对象也可以说创建了一个实例),只用一个实例进行程序设计,首先我们可以了解一下什么时候不适合使用单例模式,比如我们需要使用类同时创建多个对象的时候,且每个对象中封装了不同的数据的时候,就不能使用单例模式,就像下面的例子

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
mingming = Person('明明',19)
mingyue = Person('明月',30)
mingri = Person('明日',20)

  那么什么时候适合使用单例模式,如果每个对象中封装了相同的数据,但是需要创建多个对象的时候,而且这两个实例所有的功能是一样的,所以我们就可以使用一个实例完成,在这里我们就可以使用单例模式,如下

class Person:
    def __init__(self):
        self.name = '123123'
        self.age = '20'

    def f1(self):
        pass

    def f2(self):
        pass

mingming = Person()
mingming.f1()

mingyue = Person()
mingyue.f1()

  为什么要使用单例模式,就是为了在封装数据相同的情况下,而且每个实例可执行的方法相同的时候,不必创建多个对象,只需要使用一个实例,来完成多个相同实例所完成的功能,通过这种方式减少内存的使用。

如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们的python圈,裙号930900780,可领取python学习资料,会节约很多时间,减少很多遇到的难题。

二、单例模式应用的场景

  • 需要频繁的进行创建和销毁的对象;
  • 创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
  • 工具类对象;
  • 频繁访问数据库或文件的对象。

三、单例模式的优点以及缺点

优点

系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。

由于单例模式在内存中只有一个实例,减少了内存开销。 
单例模式可以避免对资源的多重占用,例如一个写文件时,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。 
单例模式可以再系统设置全局的访问点,优化和共享资源访问。 
其中使用到单例模式时,考虑较多的就是多线程的情况下如何防止被多线程同时创建等问题。

当这个类的对象在多个地方创建的时候,使得内部的方法多次调用,但是希望只要一个对象操作这个方法,或者不希望多个地方同时调用这个方法,需要保持这个方法的单一性质,就用单利模式

缺点

使用单例模式,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。

 

四、单例模式代码编写

接下来我们就模拟一个数据库连接池来实现单例模式
首先我们介绍一下数据库连接池
我们通过程序进行数据库的操作的时候,每次都需要连接数据库,但是连接数据库需要消耗较多的时间,所以我们可以在我们主机的内存里维护一个数据库连接池,在这个连接池中有若干个已经连接数据库的连接,我们想要连接数据库的时候直接到连接池中取出一个连接即可,省去了连接的时间。

非单例模式

import random

class SqlConnectionPool:

    __instance = None

    def __init__(self):
        self.ip = "127.0.0.1"
        self.port = 3306
        self.pwd = '123456'
        self.username = 'alexsel'
        #去连接
        self.conn_list = [1,2,3,4,5,6,7,8,9,10]

    def get_connection(self):
        #获取连接
        r = random.randrange(1,11)
        return r


#我们创建多个对象内存地址是一样的,说明拿到的是同一个对象
obj = SqlConnectionPool()
print(obj)
obj1 = SqlConnectionPool()
print(obj1)
obj2 = SqlConnectionPool()
print(obj2)

输出结果:
<__main__.SqlConnectionPool instance at 0x0000000002630788>
<__main__.SqlConnectionPool instance at 0x0000000002630888>
<__main__.SqlConnectionPool instance at 0x00000000026308C8>

非单例模式每次内存输出的结果都不同,下面是单例模式。

import random

class SqlConnectionPool:

    __instance = None

    def __init__(self):
        self.ip = "127.0.0.1"
        self.port = 3306
        self.pwd = '123456'
        self.username = 'alexsel'
        #去连接
        self.conn_list = [1,2,3,4,5,6,7,8,9,10]

    @staticmethod   #静态方法是由类调用的
    def get_instance():
        if SqlConnectionPool.__instance:
            return SqlConnectionPool.__instance
        else:
            #创建一个对象,并将对象赋值给静态字段__instance
            SqlConnectionPool.__instance = SqlConnectionPool()
            return SqlConnectionPool.__instance

    #单例模式关键代码解析
    #当第一次调用这个静态方法的时候,判断__instacne的值是None所以执行else,然后在else中创建一个对象赋给静态字段__instance,然后返回这个静态字段
    #第二次调用这个今静态方法的时候,判断__instance的值为真,所以直接返回这个静态字段,而这个静态字段中包含的是第一次创建的对象,所以在以后调用这个方法
    #就只会调用第一次创建的对象,这就是单例模式

    def get_connection(self):
        #获取连接
        r = random.randrange(1,11)
        return r


#我们创建多个对象内存地址是一样的,说明拿到的是同一个对象
obj = SqlConnectionPool.get_instance()
print(obj)
obj1 = SqlConnectionPool.get_instance()
print(obj1)
obj2 = SqlConnectionPool.get_instance()
print(obj2)


输出结果:
<__main__.SqlConnectionPool instance at 0x000000000260C808>
<__main__.SqlConnectionPool instance at 0x000000000260C808>
<__main__.SqlConnectionPool instance at 0x000000000260C808>

以上是基于类,使用静态字段和静态方法实现的一个单例模式。

最后多说一句,想学习Python可联系小编,这里有我自己整理的整套python学习资料和路线,想要这些资料的都可以进q裙930900780领取。

本文章素材来源于网络,如有侵权请联系删除。

Python 设计模式入门指南:23 种设计模式轻松学 阅读详情

相关推荐

Python 设计模式之单例模式

单例模式是一种创建型设计模式,其目的是为了保证一个类仅有一个实例,并提供一个访问它的全局访问点,这么做有时是为了限制对共享资源的并发访问。可以看到程序中不但增加锁,还进行 double-check,这样做的原因可以看下面这张流程图,可以看到在 thread2。这是经典的单例实现方式,通过这种方式实现的类只会在没有其他实例存在时,才会创建一个实例,否则它只会返回已经创建的类实例。函数中的初始化操作会被重复执行,覆盖掉实例变量之前对实例变量的操作,因此共享数据需要保存在类变量中。职责组合在一起,这不利于维护。

yeshankuangrenaaaaa的博客 1450

python数据库连接池_Python MySQL数据库连接池组件pymysqlpool详解

引言pymysqlpool (本地下载)是数据库工具包中新成员,目的是能提供一个实用的数据库连接池中间件,从而避免在应用中频繁地创建和释放数据库连接资源。功能连接池本身是线程安全的,可在多线程环境下使用,不必担心连接资源被多个线程共享的问题;提供尽可能紧凑的接口用于数据库操作;连接池的管理位于包内完成,客户端可以通过接口获取池中的连接资源(返回 pymysql.Connection);将最大程度地...

weixin_39528559的博客 561

91 | Python 设计模式 —— 单例模式

单例模式是一种创建型设计模式,旨在确保一个类只有一个实例,并提供全局访问点。在软件开发中,有些类只需要一个全局唯一的实例,而不需要创建多个实例。单例模式就是为了满足这种需求而设计的。节省内存:由于单例模式只有一个实例,可以减少重复创建对象的内存开销。全局访问:通过全局访问点,可以方便地在任何地方获取该类的实例。避免竞争条件:单例模式可以防止多线程环境下的竞争条件,确保只有一个实例被创建。

微信号:RunsenLiu 1601

单例模式和连接池

经常看见把SQL的连接写成单例模式,就认为可以节省内存开支和优化连接速度,更有认为这样会让数据库连接在高并发的情况下造成锁。其实并未真正体会到单例的使用场景。 从连接数据库上来说,单例模式连接数据库分为两部分: 得到数据库的认证和服务器信息-Datasource 连接数据库-Connecting 其实singleton只发生在第一步Datasource,只形成一个数据库配置实例。至于第二步Connecting和单例没有任何关系,而在高并发出现锁的时候推荐使用连接池才是正道。 只有把Connecting写

nibuyaoshiwang的博客 1380

全本地AI代理实战:零数据外泄的本地化Agent工作流搭建

全本地AI代理是一种将大语言模型推理、长期记忆与工具调用完全运行于用户本地设备的智能体架构,其核心原理在于通过进程隔离与标准化协议实现模型层、记忆层和工具层的解耦协同。相比依赖云端API的传统方案,它在数据主权、响应确定性与环境复现性上具备不可替代的技术价值。典型应用场景包括法务合规文档处理、离线工业现场辅助决策、以及高敏感度企业知识管理。本文聚焦Qwen2+Ollama+SurrealDB+Agno技术栈,详解如何构建可落地的全本地AI代理系统,覆盖从硬件适配、向量记忆建模到多模态插件协同的完整链路。

weixin_34194964的博客 650

ContextCapture导入点云进行重建

ContextCapture导入点云进行重建

天桥飞熊的博客 1万+

python实现单例模式及其应用

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

小太阳xss的博客 1636

127.手机防回滚机制(Anti-Rollback)详解|efuse熔丝原理与降级绕过方案

手机刷机与维修技术指南 本文针对电子工程师和维修人员,详细介绍了主流手机品牌(高通、联发科、苹果)的刷机原理与维修方法。内容包括三大平台的刷机协议差异、关键操作模式(Fastboot/DFU/EDL)、分区表修复等核心技术,并提供了完整的Python自动化刷机脚本。文章重点解决系统崩溃、基带丢失、分区损坏等常见故障,涵盖从环境搭建到具体操作的全流程指导,所有指令均经过实测验证。适用于专业维修场景下的跨品牌设备修复需求。

2601_95651806的博客 292

设计模式:单例(Singleton)模式

文章目录一、设计模式二、单例设计模式二、代码实现1.饿汉式2.懒汉式二、单例模式优点1.优点2.举例 java.lang.Runtime三、单例模式应用场景 一、设计模式 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、 以及解决问题的思考方式。设计模免去我们自己再思考和摸索。就像是经典 的棋谱,不同的棋局,我们用不同的棋谱。”套路” 二、单例设计模式 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对 某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

qq_39816406的博客 735

加速访问Cloudflare的网站的解决方案

本文主要介绍了加速访问Cloudflare的网站的解决方案,希望能对大家有所帮助。通过软件计算得到最快的IP地址的效果图如下图所示,具体解决方案参考下文。 在这里插入图片描述 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

基于Simulink进行双向DC-DC变换器的仿真建模

特点双向性:可以将能量从一个电压等级转换到另一个,且方向可逆。效率高:通过合理的控制策略减少能量损失。应用广泛:如电池管理系统、混合动力汽车等。挑战拓扑选择:根据应用场景选择合适的电路结构(如buck-boost、full-bridge等)。控制策略:确保高效稳定运行的同时,适应负载变化。热管理:有效散热以保持长期可靠性。首先明确要模拟的任务内容。设计一个能够支持双向能量传输的变换器。根据输入输出电压要求确定合适的变换器拓扑。实现有效的控制策略来维持输出电压稳定。

xiaoheshang_123的博客 367

python def return_零基础小白Python入门必看:设计模式之单例模式

一、单例模式存在的意义  在这里的单例就是只有一个实例(这里的实例就像在面向对象的时候,创建了一个对象也可以说创建了一个实例),只用一个实例进行程序设计,首先我们可以了解一下什么时候不适合使用单例模式,比如我们需要使用类同时创建多个对象的时候,且每个对象中封装了不同的数据的时候,就不能使用单例模式,就像下面的例子class Person: def __init__(self,name,age...

weixin_39608657的博客 136

(王道408考研数据结构)第二章线性表-第一节:线性表的定义和基本操作

文章目录一:线性表的定义二:线性表的基本操作 一:线性表的定义 线性表(Linear List):零个或多个数据元素的有限序列 元素之间是有顺序的 若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他元素都有且只有一个前驱和后继 线性表强调有限,“所有的整数按递增次序排列”很明显不是线性表 线性表可以表示为 L=(a1,a1,...,ai+1,...,an)L=(a_{1},a_{1},...,a_{i+1},...,a_{n})L=(a1​,a1​,...,ai+1​,...,an​) a

快乐江湖的博客 3705

python单例模式数据库连接池_零基础小白Python入门必看:设计模式之单例模式

一、单例模式存在的意义  在这里的单例就是只有一个实例(这里的实例就像在面向对象的时候,创建了一个对象也可以说创建了一个实例),只用一个实例进行程序设计,首先我们可以了解一下什么时候不适合使用单例模式,比如我们需要使用类同时创建多个对象的时候,且每个对象中封装了不同的数据的时候,就不能使用单例模式,就像下面的例子class Person: def __init__(self,name,age...

weixin_39830917的博客 220

把核心变干净的代价与回报:为什么推动 Clean Core,几乎绕不开 SAP Integration Suite 与 API Management

Clean Core的核心价值在于构建可持续升级的ERP系统架构,其关键不在于减少代码或限制扩展,而是通过解耦和治理实现系统边界的清晰划分。这一理念将推动企业从传统的"私搭乱建"式集成向平台化工程转型,而SAP Integration Suite和API Management正是实现这一转型的核心组件。 Integration Suite作为集成中枢,通过统一平台、可复用内容库和事件驱动架构,将碎片化连接转变为标准化能力;API Management则负责建立接口治理体系,通过统一入口、

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 243

010、Zephyr RTOS开发环境搭建(Docker)

摘要 本文分享了使用Docker搭建Zephyr RTOS开发环境的实践经验。作者通过团队新人配置环境的真实案例,指出传统安装方式存在版本冲突、缓存污染等问题,而Docker方案能确保环境一致性。文章详细介绍了自定义Docker镜像的设计思路,重点解决工具链版本匹配、Python虚拟环境隔离等问题,将镜像体积从2GB优化到800MB。提供了从拉取镜像到点亮LED的完整工作流程,并总结了USB设备直通、文件权限、缓存问题等常见陷阱。还探讨了多阶段构建、CI集成等进阶用法,同时客观分析了Docker方案的局限性

m0_50546716的博客 79

设计模式Python版 单例模式

介绍了GOF单例模式,单例模式的Python示例,以及单例模式在Django框架的应用。

分享、交流、合作 3305

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

零基础Python快速入门:新手必看的常见报错与修复指南

本文为Python新手提供了常见报错的快速修复指南,涵盖五大典型错误:语法错误(SyntaxError)、缩进错误(IndentationError)、命名错误(NameError)、类型错误(TypeError)和索引越界(IndexError)。文章强调报错是学习编程的重要反馈,并介绍"READ"调试原则(复现-读懂-分析-搜索)。附带Python环境搭建建议和学习资源推荐,帮助零基础用户快速入门并建立调试思维。

weixin_42636075的博客 1894

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

设计模式实践教程 - 基于 micooz/DesignPattern 开源项目

设计模式实践教程 - 基于 micooz/DesignPattern 开源项目 项目介绍 该项目由 Github 用户 micooz 维护,是针对软件开发中常见设计模式的实现集合。它旨在提供一个学习和理解各种设计模式的实战平台,涵盖了从单例模式到观察者模式等二十多种经典设计模式。通过此仓库,开发者可以深入学习每种模式的概念、应用场景及其实现细节,助力提升代码质量和可维护性。 项目快速启动 环境要求...

gitblog_00751的博客 819

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

python中的设计模式:单例模式

设计模式的确切数量并没有一个统一的标准,因为不同的资料和文献可能会对设计模式的定义和分类有所不同。然而,最常见的设计模式集合是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides这四位作者在他们的著作《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)中提出的23种模式。:提供了对象创建的机制,能够增加已有代码的灵活性和可重用性。

瑞瑞的博客 1452

18个Python入门经典必背的程序分享

18个Python入门经典必背的程序分享

xiangxue888的博客 1万+

【设计模式】Python单例模式:从入门到实战

单例模式大概是最简单的设计模式了,核心思想就一句话:一个类只允许创建一个实例。听起来简单,但 Python 里实现方式五花八门,而且用不好还容易踩坑。

weixin_63434398的博客 1104

C++/python之设计模式(1)之什么是单例模式

C++/python之设计模式(1)之什么是单例模式

ULTRAmanTAROACE的博客 1693

Python设计模式:享元模式和单例模式

设计模式八:享元模式和单例模式 什么是享元模式 享元模式是一个用于优化的设计模式,通过为相似对象引入数据共存来最小化内存使用,提升性能。 一个享元就是一个包含状态独立的不可变数据的对象,依赖状态的可变数据不是享元的一部分,每个对象的这种信息不同,无法共享。 享元是一种特定于面向对象编程优化的设计模式,关注的是共享对象数据。 使用场景 应用需要使用大量的对象。 对象太多,存储/渲染的代价太大。 对象...

生活屁颠过的博客 2万+

python零基础入门到精通,python零基础入门教程

大家好,小编为大家解答python零基础入门到精通的问题。很多人还不知道python零基础入门教程,现在让我们一起来看看吧!别问我怎么知道的,作为科班出身,我就是一个多星期就从零开始把 Python 基础语法学完了,两三个月就找到了 Python 后台开发的实习工作。其实就一句话:零基础学习 Python,视频为主,书籍为辅,多敲代码。这就叫“理论 + 实战”。下面我就说一下我自己的学习思路,尽量让大家少做选择,直接跟着学走就完事了!

high_colever的博客 1066

Python设计模式 - 单例模式

单例模式是一种创建型设计模式, 其主要目的是确保一个类只有一个实例, 并提供一个全局访问点来访问该实例。

mofei 1448
上一篇: 大佬用python写了个豆瓣短评爬虫,有你喜欢的电视试试吗
下一篇: 零基础小白学python之【贝壳房价爬取】(一)
python小丸子
博客等级 码龄6年 30粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值