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

python装饰器实现单例模式_Python中的单例模式——装饰器实现剖析

Python中单例模式的实现方法有多种,但在这些方法中属装饰器版本用的广,因为装饰器是基于面向切面编程思想来实现的,具有很高的解耦性和灵活性。

单例模式定义:具有该模式的类只能生成一个实例对象。

先将代码写上

#创建实现单例模式的装饰器

1  def singleton (cls, *args, **kwargs):

2    instances = {}

3    def get_instance (*args, **kwargs):

4      if cls not in instances:

5        instances[cls] = cls(*args, **kwargs)

6      return instances[cls]

7    return get_instance

代码分析:第1行,创建外层函数singleton,可以传入类

第2行,创建一个instances字典用来保存单例

第3行,创建一个内层函数来获得单例

第4,5,6行, 判断instances字典中是否含有单例,如果没有就创建单例并保存到instances字典中,然后返回该单例

第7行, 返回内层函数get_instance

#创建一个带有装饰器的类

@singleton

class Student:

def __init__(self, name, age):

self.name = name

self.age = age

在Python中认为“一切皆对象”,类(元类除外)、函数都可以看作是对象,既然是对象就可以作为参数在函数中传递,我们现在来调用Student类来创建实例,看看实现过程。

#创建student实例

student = Student(jiang, 25)

@singleton相当于Student = singleton(Student),在创建实例对象时会先将 Student 作为参数传入到 singleton 函数中,函数在执行过程中不会执行 get_instance 函数(函数只有调用才会执行),直接返回get_instance函数名。

此时可以看作Student = get_instance,创建实例时相当于student = get_instance(jiang, 25),调用get_instance 函数,先判断实例是否在字典中,如果在直接从字典中获取并返回,如果不在执行 instances [cls] = Student(jiang, 25),然后返回该实例对象并赋值非student变量,即student = instances[cls]。

相关文章:

  • python图像边缘检测报告_python数字图像处理(三)边缘检测常用算子
  • jsp value设置为函数的返回值_QT中的消息传递与函数回调机制:信号(signal)和槽(slot)...
  • python exit 0_详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
  • python内置数据结构_python 内置数据结构之列表
  • z变换公式表_小白学物理之狭义相对论(1)——洛伦兹变换
  • python中调用什么模块的什么函数_在Python中如何使用使用其名称(字符串)调用模块的函数...
  • python configparser模块_Python 之ConfigParser模块
  • python的意思是什么_python中**是啥什么意思?
  • 苹果python文件执行怎么运行_Mac下怎么运行python3的py文件
  • java arraylist 初始化_Java集合详解8:Java集合类细节精讲
  • 学生a3制图标题栏尺寸手绘_机械制图基本知识点
  • c语言sort函数_C语言没灵感了?来这18个经典程序里找找吧
  • 生成有时间限制的二维码_怎么生成无限使用的微信群二维码
  • hex文件修改_树莓派工控机RevPi(十一)自定义设备(RAP文件)
  • pop3通过时间或者条件取邮件_10 分钟实现 Spring Boot 发送邮件功能
  • 自己简单写的 事件订阅机制
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • gcc介绍及安装
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript设计模式之工厂模式
  • js算法-归并排序(merge_sort)
  • Linux Process Manage
  • Logstash 参考指南(目录)
  • NSTimer学习笔记
  • Object.assign方法不能实现深复制
  • October CMS - 快速入门 9 Images And Galleries
  • Python学习之路13-记分
  • Spring框架之我见(三)——IOC、AOP
  • Web标准制定过程
  • Zepto.js源码学习之二
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 复杂数据处理
  • 简单基于spring的redis配置(单机和集群模式)
  • 今年的LC3大会没了?
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 理解在java “”i=i++;”所发生的事情
  • 力扣(LeetCode)965
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 使用 Docker 部署 Spring Boot项目
  • 微服务入门【系列视频课程】
  • 一起参Ember.js讨论、问答社区。
  • Mac 上flink的安装与启动
  • 关于Android全面屏虚拟导航栏的适配总结
  • !!java web学习笔记(一到五)
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (LeetCode 49)Anagrams
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (八)Spring源码解析:Spring MVC
  • (动态规划)5. 最长回文子串 java解决
  • (过滤器)Filter和(监听器)listener
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)Sublime Text3配置Lua运行环境
  • (转)重识new