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

作者:yaominghui 时间:2023-08-14 17:22:00 

单例模式

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

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

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

  • 使用模块

  • 使用__new__使

  • 用装饰器(decorator)

  • 使用元类(metaclass)

使用模块

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

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

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

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

使用__new__

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

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

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

执行情况如下:

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

使用装饰器

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

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

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

使用 metaclass

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

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

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

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

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

来源:https://www.cnblogs.com/lincappu/p/8304974.html

标签:python,单例,模式,创建
0
投稿

猜你喜欢

  • Python3.5实现的三级菜单功能示例

    2023-08-01 13:37:26
  • Python实现的NN神经网络算法完整示例

    2023-10-06 04:30:41
  • Python 远程开关机的方法

    2022-06-19 18:12:30
  • DreamweaverMX 2004打造细线表格

    2008-10-01 09:39:00
  • python快速查找算法应用实例

    2021-04-17 10:28:13
  • 分享很实用的css圆角写法[百度有啊提取]

    2009-01-06 13:05:00
  • 如何把一个Excel文件放到ASP页面中去?

    2009-11-07 17:54:00
  • Python给定一个句子倒序输出单词以及字母的方法

    2022-11-21 00:36:50
  • 详解Golang并发操作中常见的死锁情形

    2023-07-03 13:17:43
  • PaddleNLP ppdiffusers 自动生成兔了个兔海报

    2023-07-20 01:56:39
  • asp连接各种数据库代码

    2008-03-11 11:16:00
  • asp.net FindControl方法误区和解析

    2024-06-05 09:28:08
  • asp中的on error resume next用法

    2008-03-09 15:22:00
  • 如何计算 tensorflow 和 pytorch 模型的浮点运算数

    2023-07-17 04:20:58
  • Python实现输出某区间范围内全部素数的方法

    2022-04-25 10:04:50
  • js实现鼠标拖拽缩放div实例代码

    2024-05-13 10:38:12
  • JavaScript 中获取数组最后一个元素方法汇总

    2024-06-07 15:25:25
  • Python异常处理知识点总结

    2023-01-04 16:03:36
  • 什么是python的自省

    2022-04-24 19:06:50
  • python重复值处理得方法

    2023-07-03 20:57:43
  • asp之家 网络编程 m.aspxhome.com