python中单例模式的几种实现方法

python实现单例模式 (附完整源码) 阅读详情

  单例模式是一种程序设计的方法,我理解单例模式:某个进程在生命周期内某类只存在一个实例对象,使用场景例如logger,配置模块,数据库连接池等,单实例可以减少资源使用,保证唯一性。

使用模块实现

  最简单实现单实例:模块化,python解释器当import一个py文件时都会把该文件编码为pyc流,当再次import就直接读取pyc文件,除非py文件内容有所更改才会再次编码:建立一个singleton.py文件,在文件中实例化singleton类,这样就实现了单例。优点是简单,但不灵活。

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

class singleton(object):
    pass

singleton = singleton()
   使用__new__,metaclass

     使用__new__这个魔术方法主要是在类初始化时进行控制。魔术方法可以理解为python代码和解释器的一种规约,python类在实例化时首先调用__new__去创建一个对象再__init__去初始化这个new出来的对象,所以__new__这个方法必须返回一个对象。当类中没有显式定义__new__方法时会调用父类中的__new__方法。所以要实现单例可以显式定义__new__方法:

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

class singleton(object):
    def __new__(cls, *args, **kwargs): 
        if not hasattr(cls, '_instance'):
            cls._instance = super(singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance
    def __init__(self):
        pass

#这里有个问题,如果实例化singleton采用多线程就会产生两个线程同时执行
#cls._instance = super(singleton, cls).__new__(cls, *args, **kwargs)的可能,所以针对多线程进行加锁,
#python中锁不用理会怎么造和创造者,拿起来就可以“咔擦”进行加锁.

import threading
class singleton(object):
    _instance_lock = threading.Lock() #建立一把锁
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            with singleton._instance_lock: #使用锁,with内部代码同时只能一个线程执行 
                cls._instance = super(singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance    

    python中一切皆对象,无论我们定义一个str,int或者list都是实例化了一类。就算我们定义一个类它也是元类的实例。没显式定义父类的类都会继承object类,没显式定义元类的类都会继承type。当python解释器扫描到代码中的class A,就会调用该类的元类的__new__在内存中实例化元类的一个实例,我们实例化类A时就会调用元类的__call__方法。所以元类可以拦截类的创建并对类进行修改。元类实现单实例和__new__异曲同工:

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

class Meta(type):
    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Meta, cls).__call__(cls, *args, **kwargs)
        return cls._instance
#多线程安全模式
import threading
class Meta(type):
    _instance_lock = threading.Lock()
    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            with Meta._instance_lock:
                cls.instance = super(Meta, cls).__call__(cls, *args, **kwargs)
        return cls._instance

#实现单实例的类需要继承Meta元类
#python 2
class singleton(object):
    __metaclass__ = Meta

#python 3 
class singleton(metaclass=Meta):
    pass
  使用装饰器
    类修饰器和函数修饰器都是同个功能:帮被修饰的对象打个包装再返回该对象,所以实现单实例也比较好理解
# *_* coding: utf-8 *_*
 
def dec(cls):
    _instance = {}
    def indec(*args, **kwargs):
        if cls not in _instance:
            _instance[cls] = cls(*args, **kwargs)
        return _instance[cls]
    return indec
#单实例实现方式,主要是在创建类时利用闭包原理把_instance封装在类外面,如下代码实例化singleton时候实际是调用indec函数
@dec
class singleton(object):
    pass

#多线程同
总结

   1.如果没有特别需求,用模块实现单实例方便又简单

   2.如果有多个类需要实现单实例可以使用修饰器

   3.如果有功能能上的特别定制需求才考虑使用__new__

   4.metaclass设计是给非一般的人使用的,一般是不用-_-

Conformal LEC逻辑等价性检查介绍和参考脚本 分为三个产品:Conformal L、Conformal XL、Conformal GXL。L是功能性检查,XL支持复杂数据通路的综合和APR优化,GXL支持定制的stdcell和定制memory的检查。Cadence Conformal Equivalence Checker,就是常说的LEC,可以用来验证RTL、门级网表、甚至spice网表的逻辑等价性。do文件是conformal的脚本文件,可以由综合工具(RTL Compiler/Genus)自己产生(write_do_lec),也可以手写。 阅读详情

相关推荐

音频分割:长语音音频 分割为 短语音音频 - python 实现

音频分割:长语音音频 分割为 短语音音频 - python 实现

DATABALL 的博客 1205

Python实现单例模式

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

bb8886的博客 1万+

矩阵LED和矩阵按键

先说矩阵LED,如图: 下面以行几、列几的表达方法说明 三极管可以当做开关使用 由图可知,如果想让一个LED亮,那么它对应的行和列的三极管都要导通。如果这个矩阵每次只亮一个LED,那么正常写程序没问题。 如果我们想让LED1和LED6亮,其他灯不亮,则需要开启行1、行2、列1、列2,随之带来的问题就是LED2和LED5也会跟着亮起来。 解决方法类似于扫描,因为单片机运行速度很快,可以在很短的时间内开关数次而肉眼看不到。所以我们可以每次只亮一列(排)灯,亮单位时间后关掉同时开启另外一列(排),如此四次一循环

qq_46615634的博客 5789

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

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

aobian2884的博客 1923

YOLOv11改进策略【Neck】| PRCV 2023,SBA(Selective Boundary Aggregation):特征融合模块,描绘物体轮廓重新校准物体位置,解决边界模糊问题

SBA 模块在医疗图像分割中具有重要作用,其设计出发点是解决图像中物体边界模糊以及融合特征时的冗余和不一致问题。

Limiiiing的博客 1942

Linux 内核中 ARP 协议的全链路解析:从触发机制到物理层发送

核心设计思想按需解析:减少不必要的 ARP 请求,降低网络负载。分层解耦:协议栈各层(邻居子系统、Netfilter、驱动)职责分离,提高扩展性。ARP的核心作用是将IP映射为MAC地址,确保数据链路层能正确封装帧。其触发时机围绕“未知MAC地址需求”展开,覆盖通信初始化、缓存更新、网络变更及维护等多种场景。

数字人生 367

用Python实现单例模式

单例模式是一种非常有用的设计模式,它可以确保一个类只有一个实例,并且该实例在整个程序中都可用。在 Python 中,可以使用多种方式实现单例模式,如使用类装饰器、元类、模块、闭包等。在实现单例模式时,需要考虑线程安全、生命周期管理和依赖管理等问题,以确保单例对象的正确性和可靠性。

weixin_73348410的博客 2825

手把手教你用ESP32-S3打造智能聊天机器人-立创实战派

本文将详细介绍如何利用立创ESP32-S3开发板,烧录小智AI程序,快速实现一个功能强大的聊天机器人。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 9911

编程|Python单例模式的几种实现方式

以上就是三种常见的Python单例模式实现方式。单例模式在某些场景下非常有用,特别是在需要保证全局唯一性的情况下。开发人员应当根据具体需求选择合适的实现方式,以确保程序的性能和资源的有效利用。

dugking的博客 616

芒果YOLO11改进137:卷积AKConv篇,即插即用,具有任意采样形状和任意数量的参数的卷积内核

卷积AKConv篇,即插即用,具有任意采样形状和任意数量的参数的卷积内核

包括YOLOv5、YOLOv7、YOLOv8等模型改进 295

109. SAP ABAP 应用程序中的锁机制和工作原理介绍

SAP ABAP 系统中的锁概念,是 SAP ABAP 为了保证`数据一致性`而引入的一种保护机制。 像 SAP 这种复杂的企业级应用,系统中同一时间段的同一份数据,可能会有多个 Transaction(终端用户或者 API )同时进行读写操作。为了防止出现数据不一致,SAP ABAP 引入了锁机制。 这种锁机制并非数据库服务器层面的锁,而是在 SAP ABAP 应用服务器层面上工作,加锁和解锁都由专门的 ABAP Function Module 来完成。

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

使用python实现单例模式的三种方式

在整个进程中,有且只有一个对象存在,在任何地点使用都是同一个对象,可以解决多线程资源竞争问题,也常用于配置信息。本文主要介绍使用python的三种实现单例模式的方式。

Crazy博客 2047

Winform从入门到精通(21)——ProgressBar(史上最全)

本介绍ProgressBar控件的详细用法,包含所有属性、事件,绝对史上最全!

qq_34059233的博客 3350

Python中实现单例模式的几种常见方法

Python提供了多种实现单例模式的方法,包括使用模块、装饰器、重写__new__方法、使用元类以及线程安全机制等。每种方法都有其适用场景和优缺点,可以根据实际需求选择合适的方法。单例模式虽然有其优点,但也可能导致代码的耦合性增加,因此在设计时要权衡利弊。

md_1008的博客 464

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

OV9734 DATASHEET,完整规格书

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

python实现单例模式的几种方法实例详解

单例模式(Singleton Pattern): 是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 实现单例模式第一种方法: 1.实例化一个的对象,要用时直接import导如这个对象,而不是再实例化一个,这样就做到了单例模式了,每次都用的是同一个对象,此处就不举例了; 实现单例模式第二种方法: 2.我们知道,当我们实例化一个对象时,是先执行了类的__new__方法(我们没写时,默认调用object.new),实例

马儿不会飞 6966

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

python实现单例模式的几种方式_常见的在Python中实现单例模式的三种方法

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。在Python中,单例模式有...

weixin_39528467的博客 169

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

python单例模式的几种实现方法

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

weixin_30687587的博客 69

用python实现单例模式的几种方法

1、使用类的__new__方法 # 使用__new__方法,python自省 class Singleton(object): def __new__(cls, *args, **kwargs): # 如果没有隐变量_instance就调用__new__一个,python自省 if not hasattr(cls, "_instance"): orig = super(Singleton, cls) cls._ins

qq_35235032的博客 369

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

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

Python热爱者的博客 316

python单例类_python单例模式的几种实现方法

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

weixin_39849127的博客 117

验证python3实现单例模式的几种方法

下面的几种方法不是我原创的。看大神的帖子,自己敲出来验证下,写出来作为学习笔记记录下 第一种,修饰器方法 def deco1(func): """ 装饰器方法, :param func:被修饰函数 :return:返回计算结果 """ list1={} def _deco1(*args, **kwargs): if fun

zhaoforyou的博客 3182

python3 单例模式_Python单例模式(Singleton)的几种常见实现方法详解

使用python实现设计模式中的单例模式。单例模式是一种比较常用的设计模式,其实现和使用场景判定都是相对容易的。本文将简要介绍一下python中实现单例模式的几种常见方式和原理。一方面可以加深对python的理解,另一方面可以更加深入的了解该模式,以便实际工作中能更加灵活的使用单例设计模式。本文将介绍常见的实现单例模式的几种方式,这里暂不考虑多线程的情况。为了准备该篇博文,之前写了几篇相关的文章依...

weixin_39538536的博客 479

Python中实现单例模式的几种方法

1 class Singleton(object): 2 def __new__(cls,*args,**kw): 3 if not hasattr(cls,"_instance"): 4 orig=super(Singleton,cls) 5 cls._instance=orig.__new__(cls...

weixin_30267785的博客 81

简历说自己熟练python,面试让你实现单例模式的几种方法,你又了解多少?

单例模式 单例模式就是确保一个类只有一个实例.当你希望整个系统中,某个类只有一个实例时,单例模式就派上了用场. 比如,某个服务器的配置信息存在在一个文件中,客户端通过AppConfig类来读取配置文件的信息.如果程序的运行的过程中,很多地方都会用到配置文件信息,则就需要创建很多的AppConfig实例,这样就导致内存中有很多AppConfig对象的实例,造成资源的浪费.其实这个时候AppConfig我们希望它只有一份,就可以使用单例模式. 实现单例模式的几种方法 使用模块 其实,python的模块就是天

weixin_43865008的博客 636

Python中的单例模式的几种实现方式的及优化——使用类方法和静态方法

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

weixin_40432363的博客 339

python实现单例_Python 实现单例模式

# 使用Python实现单例模式# 方法一: 使用__new__方法class SingleTon(object):def __new__(cls, *args, **kwargs):if not hasattr(cls, '_instance'):cls._instance = object.__new__(cls, *args, **kwargs)return cls._instancecla...

weixin_39983993的博客 146
下一篇: centos7 搭建postfix
eggnice_鼐
博客等级 码龄8年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值