当前位置: 首页 > news >正文

Python 中使用单例模式

有这么一种场景,Web服务中有一个全局资源池,在需要使用的地方就自然而言引用该全局资源池即可,此时可以将该资源池以单例模式实现。随后,需要为某一特殊业务场景专门准备一个全局资源池,于是额外复制一份代码新建了一个全局资源池,这里的问题是本身两个池子没有任何区别,仅仅为了隔离资源而需要两个单例,这里存在一个代码复用问题。

Python 使用单例模式最佳方案是使用元类

class Singleton(type):
    """
    单例模式的元类
    """
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super().__call__(*args, **kwargs)
        return cls._instances[cls]

为解决上述问题,Python 中推荐以如下方式实现:

class Singleton(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 SingletonBean(metaclass=Singleton):
    """
    单例Bean父类
    """
    pass


class ConnectionPool:
    """
    公共代码
    """

    def __init__(self, min_size, max_size, params):
        print(min_size, max_size, params)


class ConnectionPool4A(SingletonBean, ConnectionPool):
    def __init__(self):
        super().__init__(
            min_size=10,
            max_size=100,
            params={
                ...: ...
            }
        )


class ConnectionPool4B(SingletonBean, ConnectionPool):
    def __init__(self):
        super().__init__(
            min_size=30,
            max_size=30,
            params={
                ...: ...
            }
        )


o1 = ConnectionPool4A()
print(id(o1))
o2 = ConnectionPool4B()
print(id(o2))
o3 = ConnectionPool4A()
print(id(o3))
o4 = ConnectionPool4B()
print(id(o4))


但是由于元类冲突,可能不一定可以:

class MyMeta1(type):
    ...

class MyMeta2(type):
    ...

class A1(metaclass=MyMeta1):
    ...

class A2(metaclass=MyMeta2):
    ...

class B(A2, A1):
    ...


print(type(B))
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/124461.html

相关文章:

  • vim 编辑器 使用教程
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(1):承上启下,继续上路
  • 突破焊丝虚影干扰,端子焊点缺陷检测如何实现自动化?
  • 基于 SpringBoot 的校园论坛系统
  • 蓝牙连接hci 命令和事件的交互
  • OpenSceneGraph相机系统
  • 求x的c(n,m)次方
  • 智慧零售新引擎!数图将亮相CHINASHOP 2025,助力企业降本增效
  • MCP基础学习二:MCP服务搭建与配置
  • repo仓库文件清理
  • Uniapp使用onShow语法报before initialization
  • 使用 Ktor 构建现代 Android 应用的后端服务
  • 数字世界的免疫系统:恶意流量检测如何守护网络安全
  • Java—HTML:3D形变
  • systemd 与 SysVinit
  • SmolVLM2: The Smollest Video Model Ever(三)
  • arco-design-vue:给<a-table>组件每一行添加data-id属性,并根据id数组是否包含此行id进行样式处理
  • 使用 Spring Boot 和 Uniapp 搭建 NFC 读取系统
  • 若依框架二次开发——RuoYi-AI 本地部署流程
  • 动态规划基础
  • ISP--Demosaicking
  • 学习51单片机Day02---实验:点亮一个LED灯
  • SpringDoc【使用详解】
  • 解决RecyclerView在调用smoothScrollToPosition后最后一个item底部超出屏幕的问题
  • Word / WPS 页面顶部标题 段前间距 失效 / 不起作用 / 不显示,标题紧贴页眉 问题及解决
  • 数据库主从复制学习笔记
  • Android 中支持旧版 API 的方法(API 30)
  • 深入解析计算机操作系统的底层架构与核心模块功能
  • SQL 查询中使用 IN 导致性能问题的解决方法
  • vue3开发基础流程(前21)