首页 > 编程语言 >设计模式之单例模式(Python实现)

设计模式之单例模式(Python实现)

时间:2022-09-01 09:33:47浏览次数:42  
标签:__ Python instances 单例 new 设计模式 def cls

先认识下什么是单例模式,可以参考前人的优秀分析https://blog.csdn.net/lovelion/article/details/9319181

总结起来说,当我们在代码中频繁的创建和删除对象时会消耗大量资源,拖慢运行效率,如果这些对象是重复的,那么完全不必如此,只需要保持一个对象即可

实现上就需要全局在例化该对象时只例化一次,后续例化及使用都返回这个对象

下面用Python的几种方法来实现单例模式

1、在类的构造函数中实现

python中的类的构造函数是cls.__new__(),在该函数中维持一个全局对象即可

 1 #coding:utf-8
 2 
 3 class M():
 4     _singleInstance = None
 5     
 6     def __new__(cls,*a,**k):
 7         if not cls._singleInstance:
 8             cls._singleInstance = object.__new__(cls, *a, **k)
 9         return cls._singleInstance 
10 
11     def __init__(self):
12         pass
13 ...

__new__构造函数返回一个实例对象,object是Python所有类的基类,该方法也可以在基类上实现让子类继承

2、使用装饰器

python中使用装饰器是比较灵活的方式,可以不修改原有类的代码结构,只添加功能,具体实现方式如下

 

 1 #coding:utf-8
 2 from functools import wraps
 3 
 4 
 5 def Singleton(cls):
 6     instances = {}
 7 
 8     @wraps(cls)
 9     def _singleton(*args, **kwargs):
10         if cls not in instances:
11             instances[cls] = cls(*args, **kwargs)
12         return instances[cls]
13     return _singleton
14 
15 @Singleton
16 class M():
17     def __init__(self):
18         pass
19         ...

 

 

 

 

多线程下的方式还未进行过验证,暂不讨论

标签:__,Python,instances,单例,new,设计模式,def,cls
From: https://www.cnblogs.com/zhangcheng2020/p/16645367.html

相关文章

  • 初识设计模式 - 建造者模式
    简介概念建造者设计模式(BuilderDesignPattern)又叫作生成器模式,是一种对象构建模式,其核心在于将产品和产品建造过程解耦。建设者模式允许用户只通过指定复杂对象的类型......
  • 在 Python 中将具有不同标题的多个 CSV 文件合并到一个文件中
    在Python中将具有不同标题的多个CSV文件合并到一个文件中在使用CSV文件进行数据分析时,我们可能需要处理大型数据集。在这些情况下,我们必须将所有数据合并到一个CS......
  • 用 Python 编写傅立叶级数机器人(第 2 部分——为什么选择 Python?)
    用Python编写傅立叶级数机器人(第2部分——为什么选择Python?)自然,在编写傅立叶级数机器人时可能会问一个问题,“我应该使用哪种编码语言?”,在我看来,唯一的答案是Python......
  • 设计模式 引子
       设计模式的世界丰富多彩,比如生产一个个“产品”的工厂模式,衔接两个不相关接口的适配器模式,用不同的方式做同一件事情的策略模式,构建步骤稳定,根据不同配置构造稳定......
  • 2022 年要知道的 10 大秘密 Python 编码技巧
    2022年要知道的10大秘密Python编码技巧编码最新消息Python顶级列表TOP10SECRETPYTHONCODINGTIPSTOKNOWIN2022有经验的程序员也发现在发现新技巧方面还......
  • python学习Day57
    Day57今日内容概要静态文件及相关配置请求方法request对象方法pycharm连接MySQLdjango连接MySQLdjangoorm简介orm基本操作语法数据库迁移字段增删改查记录......
  • 2022 年学习 Python 的 5 个理由
    2022年学习Python的5个理由Python在2022年非常流行,原因有几个什么是Python,我为什么要关心?Python可用于几乎任何软件开发领域,包括Web开发、数据科学、数据......
  • python + VS code + Docker
    目录1.安装docker2.构建映像3.启动docker4.安装VisualStudioCode并配置5.参考在python项目开发中,经常需要安装依赖包,还要考虑版本兼容问题。尤其是,升级一个python版本,......
  • python numpy.stack()
    numpy.stack()这个函数的功能就是堆叠array,就是对矩阵升维。但是比较头疼的就是stack()中的axis的理解。我找到了一篇比较好的博客,直接转载到这里了numpy.stack最通俗......
  • python相关知识点
    1.enumerate用于将可迭代对象拆包成元组比如list、dic、rangelist=[0,1,2,3]dic={'a':1,'b':2,'c':3}forainenumerate(list):print(a)#输出为(0,0)......