Python单例模式的四种创建方式实例解析

 更新时间:2020年03月04日 13:31:45   投稿:yaominghui  
这篇文章主要介绍了Python单例模式的四种创建方式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

在 Python 中,我们可以用多种方法来实现单例模式:

  • 使用模块
  • 使用__new__使
  • 用装饰器(decorator)
  • 使用元类(metaclass)

使用模块

其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成.pyc文件,当第二次导入时,就会直接加载.pyc文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:

将上面的代码保存在文件mysingleton.py中,然后这样使用:

使用__new__

为了使类只能出现一个实例,我们可以使用__new__来控制实例的创建过程,代码如下:

在上面的代码中,我们将类的实例和一个类变量_instance关联起来,如果cls._instance为 None 则创建实例,否则直接返回cls._instance。

执行情况如下:

使用装饰器

我们知道,装饰器(decorator)可以动态地修改一个类或函数的功能。这里,我们也可以使用装饰器来装饰某个类,使其只能生成一个实例,代码如下:

在上面,我们定义了一个装饰器singleton,它返回了一个内部函数getinstance,该函数会判断某个类是否在字典instances中,如果不存在,则会将cls作为 key,cls(*args, **kw)作为 value 存到instances中,否则,直接返回instances[cls]。

使用 metaclass

元类(metaclass)可以控制类的创建过程,它主要做三件事:

拦截类的创建修改类的定义返回修改后的类

使用元类实现单例模式的代码如下:

小结Python 的模块是天然的单例模式,这在大部分情况下应该是够用的,当然,我们也可以使用装饰器、元类等方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 教你使用一行Python代码玩遍童年的小游戏

    教你使用一行Python代码玩遍童年的小游戏

    这篇文章主要介绍了一行Python代码玩遍童年的小游戏,帮助大家重回童年快乐时光,代码简单易懂,感兴趣的朋友一起学习下吧
    2021-08-08
  • Python 使用input同时输入多个数的操作

    Python 使用input同时输入多个数的操作

    这篇文章主要介绍了Python 使用input同时输入多个数的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 基于Python+Pyqt5开发一个应用程序

    基于Python+Pyqt5开发一个应用程序

    今天给大家带来的是关于Python的相关知识,文章围绕着Python+Pyqt5开发一个应用程序展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • python实现通过flask和前端进行数据收发

    python实现通过flask和前端进行数据收发

    今天小编就为大家分享一篇python实现通过flask和前端进行数据收发,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 详解Python获取线程返回值的三种方式

    详解Python获取线程返回值的三种方式

    提到线程,你的大脑应该有这样的印象:我们可以控制它何时开始,却无法控制它何时结束,那么如何获取线程的返回值呢?今天就和大家分享一下一些做法
    2022-07-07
  • 如何利用Opencv实现图像的加密解密

    如何利用Opencv实现图像的加密解密

    一般情况下,图像的加密和解密过程是通过按位异或运算实现的,下面这篇文章主要给大家介绍了关于如何利用Opencv实现图像加密解密的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • python3 打印输出字典中特定的某个key的方法示例

    python3 打印输出字典中特定的某个key的方法示例

    这篇文章主要介绍了python3 打印输出字典中特定的某个key的方法,涉及Python字典的遍历、判断、输出等相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • 使用Python写个小监控

    使用Python写个小监控

    最近使用python写了个小监控,为什么使用python?简单、方便、好管理,Python如何实现简单的小监控,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • Python的Web框架Django介绍与安装方法

    Python的Web框架Django介绍与安装方法

    这篇文章介绍了Python的Web框架Django与安装方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Python的pytest测试框架中fixture的使用详解

    Python的pytest测试框架中fixture的使用详解

    这篇文章主要介绍了pytest中fixture的使用详解,pytest是一个非常成熟的全功能的Python测试框架,能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试,需要的朋友可以参考下
    2023-07-07

最新评论