python 单例

2023-10-30


1. 使用模块


from AA import a

2. 使用__new__


在Python中,可以通过重写类的__new__方法来实现单例模式。单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点。

class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not isinstance(cls._instance, cls):
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance

在这个例子中,我们首先检查类变量_instance是否已经是这个类的一个实例。如果是,我们就返回这个实例。如果不是,我们就创建一个新的实例并将其存储在_instance中,然后返回这个新的实例。

这样,无论我们创建多少次这个类的实例,我们都只会得到一个相同的实例。这就是单例模式的主要特点。


3. 使用装饰器


在Python中,装饰器是一种特殊的函数,它可以修改其他函数的行为或属性。我们可以使用装饰器来实现单例模式。

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

在这个例子中,singleton是一个装饰器,它接受一个类作为参数。singleton装饰器定义了一个字典instances,用来存储每个类的实例。

当我们用singleton装饰一个类时,比如MyClass,并尝试创建这个类的实例,Python会首先调用singleton装饰器。在singleton装饰器中,我们检查instances字典是否已经有MyClass的实例。如果有,我们就返回这个实例。如果没有,我们就创建一个新的实例,并将其存储在instances字典中,然后返回这个新的实例。

这样,无论我们创建多少次MyClass的实例,我们都只会得到一个相同的实例。这就是单例模式的主要特点。


4. 使用元类


在Python中,元类是创建类的类。我们可以通过定义一个元类,并使用这个元类来创建类,来实现单例模式。

以下是一个使用元类实现单例的例子:

python
class SingletonMeta(type):
    _instances = {}

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

class Singleton(metaclass=SingletonMeta):
    pass

在这个例子中,SingletonMeta是一个元类,它重写了__call__方法。在Python中,当我们调用一个类时(例如Singleton()),实际上是在调用这个类的__call__方法。

在SingletonMeta的__call__方法中,我们检查_instances字典是否已经有Singleton的实例。如果有,我们就返回这个实例。如果没有,我们就创建一个新的实例,并将其存储在_instances字典中,然后返回这个新的实例。

Singleton类使用SingletonMeta作为其元类,所以当我们创建Singleton的实例时,实际上是在调用SingletonMeta的__call__方法。这样,无论我们创建多少次Singleton的实例,我们都只会得到一个相同的实例。这就是单例模式的主要特点。

使用这个单例类的示例代码如下:

s1 = Singleton()
s2 = Singleton()

# s1 and s2 are the same instance
assert s1 is s2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 单例 的相关文章

随机推荐

  • 记录安装mysql5.6到centos6上面的经历

    下载MySql rpm安装包 国外网站下载太慢 国内镜像下载吧 http mirrors sohu com mysql MySQL 5 6 注意下载 el6 版本的包 el7 是linux 7上使用的 不要直接就奔最新版本去了 主要需要下载
  • 自定义注解记录操作日志

    自定义注解 自定义注解首先要知道元注解 也就是注解的注解 是jdk内置的 元注解有四种 Retention 注解保留策略 Retention RetentionPolicy SOURCE 仅存在于源码中 Retention Retentio
  • 本地迅速创建ftp服务器,让其他人获取(下载)你的文件

    我们现在的目的是想要别人共享我们的文件 我们在自己的电脑上创建一个文件服务器ftp 然后别人在浏览器中访问我们的ip地址 或自定义的域名 即可达到别人快速下载我们的资源的目的 1 创建ftp用户 依次点击我的电脑 管理 或者直接cmd下执行
  • 手把手教学,免费不限速内网穿透,zerotier值得拥有

    文章目录 常见的内网穿透原理 frp代理 p2p直连 zero安装说明 1 登录zerotier管理平台创建一个网络 2 windows安装zerotier 并加入到网络 3 linux设备加入到网络 4 安卓设备加入到网络 访问测试 常见
  • QString类型装换为const char*的方法

    QString NewBuildProject ProjectNameLineEdit text toStdString c str 说明 1 NewBuildProject ProjectNameLineEdit text 输出为QStr
  • java实时监控数据变化_银行监控报警系统性能提升50倍,用的全是开源组件

    作者介绍 胖亚鹏 监控技术领域专家 具备十余年监控系统建设经验 精通主流商用及开源监控软件产品的集成应用 专注于监控工具建设 全面支撑传统架构和容器云 分布式架构下的监控管理 探索研究智能化监控 推动分布式架构下以大数据 人工智能技术为基础
  • 【LeetCode-简单】39. 组合总和 (图文详解)

    建议 完全不了解递归的同学 先去学习一下递归 题目 题目地址 https leetcode cn problems combination sum 示例 方法1 回溯算法 思路 来自视频https www bilibili com vide
  • 12.14黄金白银TD行情怎么看;美原油最新交易操作指导

    黄金最新资讯 消息面 周二 12月14日 国际金价上涨 但美元同时走强限制了金价涨势 投资者等待美联储今日晚些时候召开的会议 从中寻找美联储如何加快结束经济刺激措施 除此之外 欧洲央行英国央行也将在本周举行会议 美联储将在当日稍晚开始为期两
  • MQ怎么保证消息不丢失?

    在我们做业务时候很多时候需要用到消息队列 那消息队列中是怎么保证消息的可靠性的 我们今天学习目前主流的消息队列是怎么保证消息可靠性 1 RocketMQ 2 Kafka 3 RabbitMQ RocketMQ 持久化存储 RocketMQ
  • uviewUI中u-popup组件show属性显示和不显示控制问题

    问题 在uviewUI中u popup组件show并不是用来控制弹出层的显示与否 而是用v model来进行控制 注意查看官方的API 解决 在控件上面加入v model控制即可
  • 【C++】 C & C++ 内存管理

    文章目录 C C 内存分布 C 内存管理方式 1 操作内置类型 2 操作自定义类型 operator new 与 operator delete 定位 new C C 内存分布 C 和 C 的内存分布没什么区别 C 是基于 C 语言的 如下
  • bind 用法小技巧

    正常来说 我们写一个回调 因为这个回调方法是在组件内部调用的 我们没有办法把参数传过去 如果 rightMethod 要用到 resp 或者 review 参数的话 可能就要建全局参数 this 的指向也会有问题 很尴尬 使用 bind
  • 脉.濒湖脉学七言诀

    脉学七言诀 浮 脉 体状诗 浮脉惟从肉上行 如循榆荚似毛轻 三秋得令知无恙 久病逢之却可惊 相类诗 浮如木在水中浮 浮大中空乃是芤 拍拍而浮是洪脉 来时虽盛去悠悠 浮脉轻平似捻葱 虚来迟大豁然空 浮而柔细方为濡 散似杨花无定踪 主病诗 浮脉
  • LDV7语音识别模块 LD3320A语言识别说话踩坑

    说真的气到我了 在家里说了一个小时小杰 因为这个模块默认叫说什么 小杰 我人都裂开来这个小杰 在家里说了半个小时小杰 我妈问我怎么了最后解决问题了我来说一下 1 离咪头要远一点 这样说话识别率比较高 默认程序 说明文档说要靠着咪头说话 我个
  • Ubuntu无法检测到外接显示器,无法打开nvidia-settings或者打开nvidia-settings时有报错,ubuntu-drivers devices命令后无显示

    我安装了 nvidia 440 显卡驱动之后 出现了以下问题 手动安装的nvidia 440 Ubuntu无法检测到外接显示器 无法打开nvidia settings或者打开nvidia settings时有报错 ubuntu driver
  • crontab 配置问题 没有执行php文件

    设置了一个crontab 发现不执行 查找了原因是因为PHP的路径不对 首先 确认 PHP 可执行文件的位置 对于大多数 Linux 系统 几乎肯定是 usr bin php 如果不确定其位置 请在命令行中键入 which php 并查看响
  • com.android.ddmlib.AdbCommandRejectedException: device offline Error while Installing APK解决

    com android ddmlib AdbCommandRejectedException device offline Error while Installing APK 这个问题是adb被杀死了 重新启动一下就可以 有三种方法 一
  • STM32之串口

    文章目录 一些概念 串口初始化 1 时钟使能 2 串口复位 3 GPIO模式配置 4 串口参数初始化 5 初始化NVIC并开启中断 6 开启中断 7 使能串口 完整的初始化代码 中断函数 实验接收到A LED0亮 再接收到关 一些概念 并行
  • 百度地图api-基本用法总结

    以下内容已录制 点击观看视频 还有更多好玩的百度地图效果展示 百度地图效果 百度地图api 一些常用的用法总结 笔记 参考百度地图官方api 百度地图官方api 百度地图提供的拾取坐标 百度地图提供的拾取坐标 注 百度地图api文档是真详细
  • python 单例

    1 使用模块 from AA import a 2 使用 new 在Python中 可以通过重写类的 new 方法来实现单例模式 单例模式是一种设计模式 它保证一个类只有一个实例 并提供一个全局访问点 class Singleton obj