首页 > 编程语言 >Python - 实现【单例模式】的四种方法

Python - 实现【单例模式】的四种方法

时间:2023-12-09 17:31:42浏览次数:48  
标签:__ Singleton Python instances 实例 单例 四种 cls


方法一:使用模块实现单例模式

Python 中,每个模块只会被导入一次,因此可以将需要实现单例模式的类定义在一个模块中,每次需要使用该类时,将该模块导入即可。

# singleton.py
class Singleton:
    pass

singleton = Singleton()

在其他模块中直接引用这个singleton对象即可。

2.方法二:使用__new__方法实现单例模式:

__new__方法在创建一个实例时被调用,因此我们可以通过重写__new__方法来控制实例的创建。在实现单例模式时,我们可以在__new__方法中判断是否已经存在该实例,若存在直接返回实例,否则创建实例并返回。

class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

在实例化Singleton类时就会判断是否已经存在实例,若存在则直接返回实例,否则创建实例并返回。

方法三:使用装饰器实现单例模式:

我们可以使用装饰器将一个类装饰成一个单例类,这样每次实例化该类时都会返回同一个实例。实现的方法是使用一个字典来缓存各个类的实例,然后在装饰器中判断该类是否已经存在实例,若存在直接返回实例,否则创建实例并将其加入字典中。

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 Singleton:
    pass

在实例化Singleton类时会先调用singleton装饰器,该装饰器会判断该类是否已经存在实例,若存在则直接返回实例,否则创建实例并缓存起来。

方法四:使用元类实现单例模式:

元类是用于创建类的类,我们可以通过重写元类的__call__方法来控制类的实例化过程。在实现单例模式时,我们可以在元类的__call__方法中判断是否已经存在该类的实例,若存在直接返回实例,否则创建实例并缓存起来。

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 Singleton(metaclass=SingletonMeta):
    pass

在实例化Singleton类时首先会调用元类SingletonMeta__call__方法,该方法会判断该类是否已经存在实例,若存在则直接返回实例,否则创建实例并缓存起来。


标签:__,Singleton,Python,instances,实例,单例,四种,cls
From: https://blog.51cto.com/u_15349841/8750997

相关文章

  • [Python]运算符: / 和 % 和 //计算差异是什么?
    /和%和//(地板除)在Python中的作用是:用于对数据进行除法运算。python中与除法相关的三个运算符是//和/和%,下面逐一讲解。“/”,这是传统的除法,5/2=2.5“//”,在python中,这个叫“地板除”,3//2=1“%”,这个是取模操作,也就是区余数,8%2=0,7%2=1Python中分为3种除法:1、/,2、%,3......
  • Java开发者的Python快速进修指南:实战之跳表pro版本
    之前我们讲解了简易版的跳表,我希望你能亲自动手实现一个更完善的跳表,同时也可以尝试实现其他数据结构,例如动态数组或哈希表等。通过实践,我们能够发现自己在哪些方面还有所欠缺。这些方法只有在熟练掌握之后才会真正理解,就像我在编写代码的过程中,难免会忘记一些方法或如何声明属性等......
  • Python 潮流周刊第 30 期(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。周刊全文:https://pythoncat.top/posts/2023-12-09-weekly以下是本期摘要:......
  • 深入探究 Python 异步编程:利用 asyncio 和 aiohttp 构建高效并发应用
    在现代编程中,异步编程已成为处理高并发和IO密集型任务的重要方式。Python提供了强大的异步编程支持,包括asyncio库和aiohttp等框架。本文将深入探讨异步编程的概念,以及在Python中如何利用异步框架来实现高效的并发编程。1.异步编程概念异步编程允许程序在等待IO操作完成时......
  • python+sklearn 机器学习代码备忘
    importsklearnfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLinearRegressionimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassnsfromsklearnimportpreprocessingimportcsvimportnumpyas......
  • Python 变量类型
    变量是存储在内存中的值,这就意味着在创建变量时会在内存中开辟一个空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。变量赋值Python中的变量赋值不需要类型声明。每个变量在内存......
  • Python算法——快速排序
    快速排序(QuickSort)是一种高效的分治排序算法,它选择一个基准元素,将数组分成两个子数组,小于基准的放在左边,大于基准的放在右边,然后递归地排序子数组。快速排序通常比冒泡排序和选择排序更高效,特别适用于大型数据集。本文将详细介绍快速排序的工作原理和Python实现。快速排序的工作原......
  • Python:函数综合案例-黑马ATM
    综合案例:黑马ATM主菜单查询余额效果存取款效果#总额totaltotal=5000000#定义None影响不大,可以不定义name=None#要求客户输入姓名name=input("请输入您姓名:")#菜单提示defmenu():print("-"*19+"主菜单"+"-"*19)print(f"{name},您......
  • Python:数据容器-list(列表)
    列表定义语法:字面量[元素1,元素2,元素3,...]定义变量变量名称=[元素1,元素2,元素3,...]定义空列表变量名称=[]变量名称=list()列表内的每个数据,称之为元素以[]作为标识列表内每个元素用,逗号隔开注意事项:列表可以一次多个数据,且可以为不同数据类型,支持嵌套"......
  • Python:列表的下标索引
    列表的下标(索引):取出特定位置的数据语法:列表[下标索引]列表的下标(索引)-反向反向索引就是从后向前:从-1开始,依次递减(-1、-2、-3...)嵌套列表的下标(索引)列表[内层列表[索引]]#通过下标索引取出对应位置的数据my_list=["itheima",666,True]#列表[下标索引],从前向后从......