python的单例模式与讨论

Python实现单例模式的几种方式 认识单例模式 含义 单例模式是一种常用的软件设计模式,在应用这个模式时,类只会生成一个实例对象。 换句话说,单例模式确保某个类有且仅有一个实例,而且自行实例化并向整个系统提供这个实例,当我们在程序中的不同位置调用这个类进行实例化,如果类的实例不存在,会创建一个实例;如果已存在就会返回这个实例。 比如回收站就是单例模式的应用,我们电脑桌面上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都是使用这个唯一的实例。 优点 因为单例模式在全局内只有一个实例,因此可以节省比较多的内存空间。 阅读详情

0.背景

每种语言都有各自的单例模式,比如JAVA经典的懒汉,饿汉模式,或是double-check线程安全的单例模式等等。这里讲述两个比较好用的单例的python写法。


1. 第一种:实现__new__方法,并将一个类的实例绑定到类变量_instance上


如果对__new__不熟悉的,可以参考文章《详解Python中的__init__和__new__》,简言之,__new__是一个类静态方法,创建这个类实例的方法,而__init__是在类实例创建之后调用。所以这种单例方法与经典的类似。代码如下:

# -*- coding: utf-8 -*-

class Singleton(object):

    #重写 __new__方法
    def __new__(cls, *args):
        if not hasattr(cls, '_instance'):  #是否存在__instance变量
            cls._instance = super(Singleton, cls).__new__(cls, *args) # 如果不存在,则新建一个类实例
        return cls._instance

    @classmethod
    def get_instance(cls, *args):
        return cls.__new__(cls, *args)
  
class MyClass(Singleton): #如果想要令MyClass变为实例,则需继承即可
    pass

if __name__ == '__main__':

    one = MyClass.get_instance()
    two = MyClass.get_instance()
    print str(one == two)

第二种:写一个装饰器函数,装饰需要单例的类,并将该类的单实例缓存下来


当调用单例类的的构造函数时,会先调用singleton函数,检查该类是否已经存在一个实例了。这种不仅是单例的一种方式,也是做缓存的一种方式,能够加快获取速度,非常经典。
# -*- coding: utf-8 -*-
from functools import wraps
def singleton(cls, *args, **kw): #装饰器函数
    instances = {}  # 所有的单例的实例都在这个instances字典中

    @wraps(cls)
    def _singleton():
        if cls not in instances:  # 当cls不在instances中
            instances[cls] = cls(*args, **kw)  # 则新建一个实例
        return instances[cls] # 然后从instances中取
    return _singleton

@singleton
class MyClass2(object): # 如果想要令MyClass2变为实例,则需在该类写上 “@singleton”即可,更加读者一看就明了此类是一个实例类

    def __init__(self):  #只有 cls不在instances中,才会调用此__init__方法
        pass

if __name__ == '__main__':

    one = MyClass2()
    two = MyClass2()
    print str(one == two)

这两种单例方式,都非常经典,第一种更容易理解,第二种更加的pythonic,按个人喜欢使用。

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

相关推荐

Python Cookbook-6.15 实现单例模式

你想保证某个类从始至终最多只能有一个实例。

weixin_52297428的博客 779

Python 单例模式

单例(Singleton)模式,是一种常用的软件设计模式。使用它,就是为了保证全局环境下。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。**应用场景:**一个项目中多个地方需要读取同一份配置文件,如果每次使用都是导入重新创建实例,读取文件,用完后再销毁,这样做的话,就造成不必要的IO浪费,可以使用单例模式只生成一份配置在内存中。

hj1993的博客 4663

Python中单例模式的实现与应用深度剖析

单例模式的核心在于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。节省资源:避免创建多个相同实例所需的额外开销。控制访问:对实例的访问进行严格控制,确保全局只有一个访问点。数据共享:在多个地方共享同一份数据,避免数据不一致的问题。

铭渊老黄 992

Python中的单例模式

单例模式是一种创建型设计模式,用于确保一个类只能有一个实例,并提供一种方式来访问该实例。意思是无论何时创建这个类的对象,都会返回相同的实例。当一个类的实例需要被多个部分共享访问时。当希望限制一个类的实例只能有一个,以避免资源浪费或不一致性。当一个类的实例需要延迟初始化,即只在需要时才创建。

程序员小麦的博客 4034

自旋玻璃(spin glass)、自旋冰(spin ice)和量子自旋液体(quantum spin liquid)(之二)

具有相同电荷的电子相互排斥。结果,为了在极其拥挤的环境中相互超越,他们不得不改变自己的行为。剑桥大学和英国伯明翰大学于 2009 年 7 月发表的研究表明,电子可以通过量子隧穿从金属表面跳到相近位置的量子线上,这样做后,将分离成两个准粒子,命名为的自旋子和全子。Van den Brink、Khomskii 和 Sawatzky 在 1997-1998 年对轨道子进行了理论上的预测。在 2011 年 9 月发给出版商的论文中报告了它作为一个单独的准粒子的实验观察结果。

qq_32515081的博客 1万+

动态时间规整(Dynamic Time Warping,DTW):让时间序列分析不再枯燥和代码全分析

动态时间规整(DTW)是一种用于比较时间序列相似性的算法,特别适用于处理长度不同或时间轴不对齐的序列。本文介绍了DTW的核心概念,包括其通过非线性对齐解决时间扭曲问题的能力,以及在语音识别、金融分析等领域的应用。通过Python代码示例,演示了如何计算两个模拟时间序列的DTW距离,并可视化最优对齐路径。结果显示,DTW能够有效捕捉序列间的相似模式,即使它们在时间轴上存在偏移或伸缩。该算法通过最小化累积距离来评估相似性,得分越低表明序列间相似度越高。

此星光明博客 163

Python中的单例模式的几种实现方式的及优化

单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方...

aobian2884的博客 1923

扫地机器人行业 企业篇-产业总部地理分布

中国扫地机器人产业呈现区域集聚特征,广东省以13家企业领跑全国,其中深圳独占9家(如大疆、云鲸智能等),佛山、广州、东莞各有分布。江苏省6家企业主要集中在苏州(科沃斯、追觅科技等)。北京聚集了石头科技、小米等4家品牌。浙江、山东、湖南等地也有代表性企业分布。国际品牌方面,美国iRobot、韩国三星/LG、日本松下等均在各自国家设立总部,而戴森、飞利浦等欧洲品牌则将中国运营中心设在上海或苏州。值得注意的是,部分品牌如由利、宝家丽虽为外资起源,但主要运营实体已落户中国。

智能硬件研发,欢迎交流 363

Python实现单例模式

Python中单例模式的实现方法和应用场景

bb8886的博客 1万+

PCIe协议之 Equalization篇 之 理论篇 之 FFE

作为最后一道“精加工”工序,DFE利用其不放大噪声的优势,精准地消除残余的、强烈的后光标ISI,最终得到一个非常干净、张得很开的眼图,供判决器使用。信号经过信道衰减后变得模糊,首先由CTLE进行“粗调”,提供一个宽频带的增益,将眼图初步打开,为后面的DFE创造一个可以正常工作的信号环境。,它通过将输入信号在不同时间点上的多个副本(称为“抽头”)进行加权求和,来直接塑造或“整形”输出信号的波形。:这是最主要的信号路径,通常系数为正值,决定了信号的幅度。:将所有加权后的信号相加,产生最终的均衡输出。

那么菜的博客 756

从零开始讲DDR(5)——读懂Datasheet

对于开发人员来说,需要根据实际场景和使用的需要,使用不同厂家,不同型号的DDR,虽然原理上大同小异,但是还是有一些细节上的需要注意的地方,接触一个新的DDR芯片,首先就是需要找到对应的datasheet,而能都读懂datasheet,也是一个硬件工程师的必备技能。

apple_53311083的博客 5223

探索 Python 中的 5 种单例模式实现方式

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。比如:数据库链接、Socket创建链接.当涉及单例模式时,有多种实现方式可供选择。在 Python 中,你可以使用模块级别的变量、装饰器、元类等方法来创建单例。每种方法都有其自身的优势和适用场景。

Trb201012的博客 1491

第十五章数据管理成熟度评估【6’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点。)

第十五章数据管理成熟度评估【6’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点。)

JasonH2021的博客 405

python 单例模式 new_Python new 类方法和 init 实例方法以及单例模式的简单讨论

“Python 中的类都是单例模式?” 一天,一同事问我这样一个问题。这是一个奇怪的问题,可能你也这么认为。这里先不做解释,我们先来看看 __new__ 和 __init__ 方法。new 与 init__new__ 方法属于新式类,即属于 object 类。它是一个静态方法,但是其第一个参数必须是一个类(cls),这有点像一个 classmethod,其实将其看成是一个类方法也可以。该特殊方法被...

weixin_36352719的博客 344

6.4 实战项目:基于Agent内核构建Code Review智能体

本文介绍了一个基于Agent内核构建的智能Code Review系统实战项目。系统采用多Agent协作架构,包含代码质量分析、安全漏洞识别、性能优化建议等核心功能模块。文章详细展示了系统架构设计,采用协调器Agent管理多个专业Agent协同工作,并提供了基础Agent框架和协调器Agent的TypeScript实现代码。项目结合了AI Agent核心原理和多Agent协作机制,实现了自动化的代码审查流程,能够生成详细的审查报告,帮助开发者提升代码质量和安全性。

yonggeit的博客 3112

如何实现在Go语言中替换程序自身

总结起来,我们可以通过将新的程序二进制文件写入磁盘,并在运行时启动这个新的程序来实现在Go语言中替换程序自身。在Go语言中,有时候我们需要在程序运行时替换程序自身,例如更新程序版本或者进行热重启。本文将介绍一种正确的方式来实现在Go语言中替换程序自身的方法,并提供相应的源代码示例。此外,替换程序自身可能会导致正在运行的程序产生意外行为或终止,请谨慎使用,并确保在合适的时机进行替换操作。实现替换程序自身的关键是将新的程序二进制文件写入到磁盘,并在运行时启动这个新的程序。函数启动新的可执行文件,并在后台运行。

HoUnix的博客 289

python init函数传入类实例_Python new 类方法和 init 实例方法以及单例模式的简单讨论...

“Python 中的类都是单例模式?” 一天,一同事问我这样一个问题。这是一个奇怪的问题,可能你也这么认为。这里先不做解释,我们先来看看 __new__ 和 __init__ 方法。new 与 init__new__ 方法属于新式类,即属于 object 类。它是一个静态方法,但是其第一个参数必须是一个类(cls),这有点像一个 classmethod,其实将其看成是一个类方法也可以。该特殊方法被...

weixin_39902608的博客 242

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Python __new__类方法和 __init__实例方法以及单例模式的简单讨论

“Python 中的类都是单例模式?” 一天,一同事问我这样一个问题。这是一个奇怪的问题,可能你也这么认为。这里先不做解释,我们先来看看__new__ 和 __init__ 方法。 __new__ 与 __init__ __new__ 方法属于新式类,即属于 object 类。它是一个静态方法,但是其第一个参数必须是一个类(cls),这有点像一个 classmethod,其实将其看成是一个类方法也可以。该特殊方法被调用时,会创建类(cls)的一个新实例并返回,实例被创建后解释器会将该实例以及其它的参数传

python学习者的博客 392

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

python单例模式解析_Python单例模式初探

在前一篇blog中我们提到了logging模块中的root logger是单例模式的,所以紧接着我们就来探索一下单例模式在python中的实现。什么是单例模式(singleton)单例模式是一种对于创建对象行为的设计模式,该模式要求一个类只能创建并存有一个实例化对象。而为什么使用单例模式呢?单例模式是为了避免不必要的内存浪费,如多个线程调用一个类,但实际并不需要对每个线程都提供一个该类的实例;同样...

weixin_39791446的博客 175

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python 单例模式的好处_python-单例模式

说明:单例模式是所有设计模式中比较简单的一类,其定义如下:Ensure a class has only one instance, and provide a global point of access to it.(保证某一个类只有一个实例,而且在全局只有一个访问点)单例模式是指:保证一个类仅有一个实例,并提供一个访问它的全局访问点。具体到此例中,总线对象,就是一个单例,它仅有一个实例,各个...

weixin_33603331的博客 666

Python 实现单例模式的五种写法

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

SixStar_FL的博客 9506

python中的单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

m0_72557783的博客 1138

Python实现单例模式的三种方法

单例模式定义实现饿汉式单例懒汉式单例使用元类实现单例单例模式优缺点 定义 他提供了一个机制:确保一个类只有一个实例对象。 例如日志记录,数据库操作,打印机后台处理程序等。 实现 最简单的实现方法是使构造函数私有化,并创建一个静态方法来完成对象的初始化。然后对象将在第一次调用时创建,之后这个类将返回同一个对象。 注意: 类只创建一个对象 为对象提供一个访问点,使程序可以全局访问该对象 控制共享资源...

likunkun__的博客 1748

python创建单例模式_在Python中创建单例

小编典典使用元类我建议使用方法2,但最好使用元类而不是基类。这是一个示例实现:class Singleton(type):_instances = {}def __call__(cls, *args, **kwargs):if cls not in cls._instances:cls._instances[cls] = super(Singleton, cls).__call__(*args, ...

weixin_39608988的博客 131

单例模式(python)

单例模式

qq_51179608的博客 843
上一篇: 深入思考python的super()
下一篇: git 本地分支与远程分支
tab_space
博客等级 码龄11年 91粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值