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

Python学习之——单例模式

Python学习之——单例模式

  • 参考
    • 1 利用__metaclass__实现单例
      • super的用法
      • class Singleton(type)元类
    • 2 重载__new__方法实现单例模式
    • 3 利用装饰器实现单例
    • 考虑一个类如果继承一个单例类的问题

参考

python之metaclass+singleton(一)
python之metaclass+singleton(二)
python之metaclass+singleton(三)

1 利用__metaclass__实现单例

揭开Python元类(metaclass)神秘的面纱

super的用法

【python】B站最细致的super()详解,一定有你不知道的知识!
在这里插入图片描述

super(arg1):
一个参数:
# 返回一个未bind的对象
ubo = super(Male)
# bind一个object
ubo.__get__(self).__init__(age, name)super(arg1,arg2):
两个参数:
arg1:决定从MRO链中的arg1后开始
arg2:决定使用该super函数的对象object和对象的MRO,注意arg2也可以是class,但不常用

class Singleton(type)元类

singleton文件夹
在这里插入图片描述

__ init__.py文件

# -*- coding: utf-8 -*-
"""单例."""class Singleton(type):def __init__(cls, name, bases, dict):super(Singleton, cls).__init__(name, bases, dict)cls.instance = Nonedef __call__(cls, *args, **kwargs):print 'call Singleton __call__'if cls.instance is None:# 等价于cls.instance = type.__call__(cls, *args, **kwargs)cls.instance = super(Singleton, cls).__call__(*args, **kwargs)return cls.instance

利用__metaclass__实现单例的示例

class Foo(object):__metaclass__ = Singletonfoo1 = Foo()
foo2 = Foo()
#运行结果应该为True, 但实际是False, 想想为啥会出现这样的异常??
print foo1 is foo2  

请思考如下问题:

  1. 不用Foo类去创建实例,仅仅只有Foo和Singleton定义,执行脚本,会不会像第二节中打印出print语句?
    不会

  2. __call__在哪里调用?
    还记得__call__是怎么调用的吗?是一个类实例化出来的对象obj,直接通过obj ()形式调用了 __ call __。
    此处的元类根本没有复写 __new __和 __init __方法,Foo类就是Singleton创建出来的一个普通的类(就是一个Singleton类的对象,实例),因此Foo()会调用Singleton的 __call __。
    __call__中限定了只能新建一个Foo类的对象。如果想要定义的类是单例的,只要定义类时指定__metaclass__ = Singleton即可。

  3. 继承Foo类的也会是单例吗?

class FooChild(Foo):def __init__(self, a):super(FooChild, self).__init__()
foo11 = FooChild()
foo22 = FooChild()
print foo11 is foo22  #运行结果为True

2 重载__new__方法实现单例模式

“双重检查锁定”(Double-Checked Locking)单例模式

from threading import Lockclass SingletonClass(object):instance = Nonelock = Lock()def __new__(cls, *args, **kwargs):if cls.instance:return cls.instancewith cls.lock:# double checkif not cls.instance:cls.instance = super(SingletonClass, cls).__new__(cls, *args, **kwargs)return cls.instance# 测试
if __name__ == "__main__":s1 = SingletonClass()s2 = SingletonClass()print(s1 is s2)  # 应该输出 True# 在多线程环境中测试import threadingdef test_singleton():instance = SingletonClass()print(f"Instance id in thread {threading.current_thread().name}: {id(instance)}")threads = [threading.Thread(target=test_singleton) for _ in range(5)]for t in threads:t.start()for t in threads:t.join()       

3 利用装饰器实现单例

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 Foo(object):passfoo1 = Foo()#等同于
#class Foo(object):
#    pass
#foo1 = singleton(Foo)
foo2 = Foo()
print foo1 is foo2  #运行结果为True

考虑一个类如果继承一个单例类的问题

3 中继承会出现问题

# 报错function() argument 'code' must be code, not str
# 因为Foo被装饰后成为了函数而不是class
# class FooChild(Foo):# 改成如下
ClassFoo = Foo().__class__class FooChild(ClassFoo):def __init__(self, a=0):super(FooChild, self).__init__()
但是这里的 FooChild就不在是单例了,也没法在加上@singleton来实现单例了
http://www.lryc.cn/news/578989.html

相关文章:

  • 智慧赋能高压并网:分布式光伏监控系统在5.88MW物流园项目的实践解析
  • PHP Yii2 安装SQL Server扩展-MAC M4 Pro芯片
  • 【AI论文】SPIRAL:零和博弈中的自对弈通过多智能体多轮强化学习激励推理能力
  • 场外交易(OTC)财富管理系统开发及解决方案报告
  • 【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化
  • 腾讯云认证考试报名 - TDSQL数据库交付运维专家(TCCE MySQL版)
  • 电子电气架构 --- SOVD功能简单介绍
  • 二、jenkins之idea提交项目到gitlab、jenkins获取项目
  • 【NLP第二期中文分词技术:规则、统计与混合方法全解】
  • 设计模式精讲 Day 23:访问者模式(Visitor Pattern)
  • uniapp实现图片预览,懒加载
  • React Native 安卓、苹果、鸿蒙5.0 三端适配方案:条件编译 + 平台适配层
  • 信创版nhdeep档案管理系统单机版在银河麒麟桌面系统安装和使用说明
  • UI前端与数字孪生结合探索:智慧建筑的能耗管理与优化
  • 【论文阅读39】PINN求边坡内时空变化的地震动响应(位移、速度、加速度)场分布
  • npm代理设置 + npm配置镜像源
  • Node.js、npm 与 nvm 使用全指南:安装、版本管理与开发环境配置详解
  • 在 Docker Desktop 使用 Kubernetes
  • RuoYi框架低代码特性
  • 鸿蒙自定义相机的拍照页面
  • 深入理解 LoRA:大语言模型微调的低秩魔法
  • 智能合约状态快照技术:实现 EVM 状态的快速同步与回滚
  • YOLOv8模型结构构件及问题汇总【持久更新】
  • HarmonyOS应用开发高级认证知识点梳理 (四)状态管理V2应用级状态
  • 商品中心—18.库存分桶的一致性改造文档
  • GIT基础命令和分支管理
  • Linux环境下使用 C++ 与 OpenCV 实现 ONNX 分类模型推理
  • ESP32与树莓派C++、Rust开发实战
  • 在米联客4EV上部署tinyriscv
  • 高速公路闲置土地资源化利用:广西浦北互通3MW分布式光伏监控实践