首页 > 编程语言 >【补充】Python中实现单例模式的六种常见方法

【补充】Python中实现单例模式的六种常见方法

时间:2023-08-19 17:44:48浏览次数:37  
标签:__ Singleton instance Python 六种 实例 单例 def cls

【补充】Python中实现单例模式的六种常见方法

【1】类属性:

class Singleton:
    instance = None
    
    @classmethod
    def getInstance(cls):
        if cls.instance is None:
            cls.instance = Singleton()
        return cls.instance
  • 使用类属性保存实例,通过类方法获取实例。
  • 在第一次调用getInstance方法时创建实例,并在后续调用中直接返回该实例。

【2】装饰器:

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
  • 使用装饰器将原来的类包装成一个新的类,通过闭包和字典保存实例。
  • 在每次实例化时,先检查字典中是否已经存在该类的实例,如果不存在才创建实例并返回。

【3】元类:

class SingletonType(type):
    def __init__(cls, name, bases, attrs):
        super(SingletonType, cls).__init__(name, bases, attrs)
        cls.instance = None
    
    def __call__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super(SingletonType, cls).__call__(*args, **kwargs)
        return cls.instance

class Singleton(metaclass=SingletonType):
    pass
  • 定义一个元类,在元类的__call__方法中判断实例是否已存在,如果不存在则调用父类的__call__方法来创建并返回实例。

【4】基于__new__方法:

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super().__new__(cls)
        return cls._instance
  • 重写__new__方法,在实例化对象时判断类中是否已有实例,如果没有则调用父类的__new__方法来创建并返回。

【5】基于__init__方法:

class Singleton(object):
    _instance = None
    
    def __init__(self):
        if self._instance is None:
            self._instance = self
        else:
            raise Exception("Singleton instance already exists")
  • __init__方法中判断是否已有实例,如果没有则将当前实例赋值给类的类属性_instance,否则抛出异常。

【6】基于模块:

# singleton.py
class Singleton:
    pass

singleton_instance = Singleton()
  • 将实例化操作放在模块级别,通过导入该模块来获取实例。
  • 由于Python模块在运行时只会被导入一次,因此保证了实例的单一性。

标签:__,Singleton,instance,Python,六种,实例,单例,def,cls
From: https://www.cnblogs.com/dream-ze/p/17642787.html

相关文章

  • python机器学习经典算法代码示例及思维导图(数学建模必备)
    最近几天学习了机器学习经典算法,通过此次学习入门了机器学习,并将经典算法的代码实现并记录下来,方便后续查找与使用。这次记录主要分为两部分:第一部分是机器学习思维导图,以框架的形式描述机器学习开发流程,并附有相关的具体python库,做索引使用;第二部分是相关算法的代码实现(其实就是......
  • python+playwright 学习-73 page.wait_for_selector()
    前言网页上的元素有不同状态,有些元素本来不在DOM里,点击某个按钮后才出现。有些元素是本来就已经在DOM里是隐藏的状态,点某个按钮后才变成显示状态。如果我们想让元素到达指定的状态再下一步操作,可以用page.wait_for_selector()方法。page.wait_for_selector()方法wait_for_s......
  • python
    pythondeffibonacci_sequence(n):  sequence=[0,1]  foriinrange(2,n):    next_number=sequence[i-1]+sequence[i-2]    sequence.append(next_number)  returnsequence#示例输入n=10#调用函数并打印结果print("斐波那契数列前",n,"......
  • python
    pythondeffibonacci_sequence(n):  sequence=[0,1]  foriinrange(2,n):    next_number=sequence[i-1]+sequence[i-2]    sequence.append(next_number)  returnsequence#示例输入n=10#调用函数并打印结果print("斐波那契数列前",n,"......
  • python模拟用户pa取
    使用Selenium模拟用户爬取页面内容,并输出成文件。关于Selenium是什么,欢迎看这篇文章:seleniumPython教程。在这里,我只讲我主要的实现。首先作为一款工具脚本,我们应该不喜欢窗口界面吧,除非你需要动态的观察程序的操作。所以,我开启了无头浏览器模式#无头浏览器chrome_options=webd......
  • python ORM框架
    导入需要的模块和函数这里的faker是为了后期的模拟数据使用,这里先透露一下。剩下的导入都和sqlalchemy的函数或包有关,如字段的类型、session的管理器、sql建表语句的生成等。fromsqlalchemyimportcreate_engine,Column,Integer,String,DateTimefromsqlalchemy.ext.declara......
  • python生成模拟数据
    python faker的使用Faker是一个Python包,开源的GITHUB项目,主要用来创建伪数据,使用Faker包,无需再手动生成或者手写随机数来生成数据,只需要调用Faker提供的方法,即可完成数据的生成安装pipinstallFaker使用fromfakerimportFakerfaker=Faker(locale='zh_CN')fromfakerimportF......
  • Python足球小游戏代码
    基于Python pygame的足球游戏源代码,游戏可以双人玩,游戏入口程序为soccer.py。控制人物一方向键:wasd,射门键:r控制人物二,方向键:键盘方向键,射门键:k程序运行截图核心程序代码:soccer.py#-*-coding:utf-8-*-from__future__importunicode_literalsimportitertools,sys,ti......
  • python实现发送udp数据包数据
    需求:python发送udp数据包数据,支持host、port、valueFile等启动参数,其中valueFile是json格式的文件,要解析编码完成转换。分模块实现:发送端:导入所需的模块和类,例如sys、logging、argparse、json、socket以及datetime和timedelta。定义一个Sender类,变量MULTI_TABLE_HEADER和SINGL......
  • Python - 引用 内存地址 地址传递 值传递
    内存地址是数据在物理内存中的存储位置;Java常量池驻留,int是-5~256  __new__方法用于定义创建对象时执行的操作,__new__方法仅仅为用户提供一个创建对象时干预的入口,真正执行创建对象的操作由object类中的__new__方法完成。del操作的实质是断开变量与内存数据之间的引用,操......