python单例模式

文章介绍了单例模式的概念,旨在确保一个类只有一个实例,并提供了4种在Python中实现单例模式的方法:模块实现、装饰器实现、类方法实现以及基于`__new__`的实现。这些方法都用于保证特定类在程序中只有一个实例,以优化内存使用和提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、介绍


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

2、单例模式的实现方式


2.1 模块实现方式

python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:mysingleton.py

ClassMysingleton:
    deffoo(self):
        pass
​
singleton_obj=Mysingleton()

保存文件,需要使用时,直接在其他文件导入此文件中的对象 ,这个对象即是单例模式的对象

frommysingletonimportsingleton_obj

2.2 装饰器实现方式

defSingleton(cls):
    _instance={}
    def_singleton(*args,**kwagrs):
        ifclsnotin  _instance:
            _instance[cls]=cls(*args,**kwagrs)
        return_instance[cls]
    return_singleton
​
@Singleton
classA:
    a=1
    def  __init__(self,x=0):
        self.x=x
    
a1=A(2)
a2=A(4)

2.3 类方法实现

classPlayer(object):
    # 静态变量
    _instanc=None
    _flag=False
    def__new__(cls, *args, **kwargs):
        print('new 执行')
​
        ifcls._instancisNone:
            cls._instanc=super().__new__(cls)
        returncls._instanc
    
    def__init__(self):
        ifnotPlayer._flag:
            print('init')
            Player._flag=True
​
​
if__name__=='__main__':
    video=Player()
    print(video)
    music=Player()
    print(music)

2.4 基于 new实现

# 基于 __new__ 实现
class Person:
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls,'_instance'):
            cls._instance = super(Person,cls).__new__(cls)
        return cls._instance
​
p1 = Person()
p2 = Person()
print(p1)
print(p2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值