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

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

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

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

一、模块:

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

# mysingleton.py
class My_Singleton(object):def foo(self):passmy_singleton = My_Singleton()

使用:

from mysingleton import my_singletonmy_singleton.foo()

二、使用 __new__

__new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用,而 __new__方法正是创建这个类实例的方法。

class Singleton(object):_instance = Nonedef __new__(cls, *args, **kw):if not cls._instance:cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)  return cls._instance  class MyClass(Singleton):  a = 1
class Singleton(object):
def __new__(cls):
# 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance
obj1 = Singleton()
obj2 = Singleton()
obj1.attr1 = 'value1'
print obj1.attr1, obj2.attr1
print obj1 is obj2

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

三、使用装饰器

from functools import wrapsdef singleton(cls):instances = {}@wraps(cls)def getinstance(*args, **kw):if cls not in instances:instances[cls] = cls(*args, **kw)return instances[cls]return getinstance@singleton
class MyClass(object):a = 1

注:functools.wraps 则可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module____name____doc__,或者通过参数选择

#不加wraps#coding=utf-8
# -*- coding=utf-8 -*-
from functools import wraps
def my_decorator(func):  def wrapper(*args, **kwargs):  '''''decorator'''  print('Calling decorated function...')  return func(*args, **kwargs)  return wrapper    @my_decorator
def example():  """Docstring"""   print('Called example function')
print(example.__name__, example.__doc__)  #结果:('wrapper', 'decorator')
[Finished in 0.2s]#加wraps
#coding=utf-8
# -*- coding=utf-8 -*-
from functools import wraps
def my_decorator(func):  @wraps(func)  def wrapper(*args, **kwargs):  '''''decorator'''  print('Calling decorated function...')  return func(*args, **kwargs)  return wrapper    @my_decorator
def example():  """Docstring"""   print('Called example function')
print(example.__name__, example.__doc__)  执行结果:
('example', 'Docstring')
[Finished in 0.5s]

functionstools.wraps

四、使用 metaclass

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

  • 拦截类的创建
  • 修改类的定义
  • 返回修改后的类
class Singleton(type):_instances = {}def __call__(cls, *args, **kwargs):if cls not in cls._instances:cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)return cls._instances[cls]# Python2
class MyClass(object):__metaclass__ = Singleton# Python3
# class MyClass(metaclass=Singleton):
#    pass

转载于:https://www.cnblogs.com/mona524/p/7716353.html

python中的单例模式相关推荐

  1. python编程入门单例_常见的在Python中实现单例模式的三种方法

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在 ...

  2. Python中创建单例模式的六种方式

    一.基于装饰器实现单例模式 #装饰器实现单例模式def singleTon(cls):def wrapper(*args,**kwargs):if not hasattr(cls,'_instance ...

  3. Python中的单例模式的几种实现方式的及优化

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

  4. python中的单例模式_Python单例模式

    Singleton(单例) -- 对象创建型模式 在GoF的<设计模式:可复用面向对象软件的基础>如下定义: 意图 保证一个类仅有一个实例,并且提供一个访问它的全局访问点. 适用性 在下面 ...

  5. python中的单例模式介绍和使用

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

  6. 单例模式(Python中的单例类)

    目录 一.单例模式的概述 二.单例模式的优缺点 三.在Python中,单例模式有以下几种实现方式 1.通过魔法方法__new__实现 2.通过模块的导入 3.通过装饰器实现 4.通过使用类实现 一.单 ...

  7. python什么是单例模式_Python中单例模式是什么

    Python中单例模式是什么 发布时间:2020-07-20 14:14:20 来源:亿速云 阅读:61 作者:清晨 这篇文章将为大家详细讲解有关Python中单例模式是什么,小编觉得挺实用的,因此分 ...

  8. 深刻理解Python中的元类(metaclass)以及元类实现单例模式

    在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例模式的那一节有些疑惑.因此花了几天时间研究下元类这个概念.通过学习元类,我对pyt ...

  9. python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...

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

最新文章

  1. 免费字典api ,查询汉字完整信息
  2. 神经网络 卷积神经网络_如何愚弄神经网络?
  3. springboot 通过url访问本地文件
  4. awk教程入门与实例练习(一)
  5. 漫步数理统计十二——随机变量的期望
  6. [总结]用U盘安装Ubuntu 16.04
  7. redis中各种数据类型对应的jedis操作命令
  8. ZedGraph属性(转)
  9. Leetcode-213:打家劫舍 II
  10. Week08手写笔记
  11. [原创]fcitx5五笔98版本----安装
  12. 2020 IJCAI 接受论文 list 分类排列(二)
  13. 凸包, 圆角矩阵凸包, 点的旋转,任意多边形外角和为360度, 绕着某点进行旋转
  14. 更新计算机策略命令,强制更新组策略指令是什么
  15. 三层交换机原理及实验操作
  16. win7去除快捷方式小箭头
  17. 浅析Chrome Packaged Apps
  18. 404-Thenbsp;requestednbsp;reso…
  19. 关于长尾应用的一些思考
  20. 高品质MP3制作攻略

热门文章

  1. KOAProgressBar
  2. 智能医疗?轻松实现!
  3. 值得收藏的146条经典民间偏方
  4. centos8安装KVM/QEUM虚拟化
  5. 参考框架 系统 基准_带有基准的前端框架的真实比较(2018更新)
  6. Docker的使用(二:Docker客户端常用指令练习)
  7. android 请求方式有哪些,Android中的几种网络请求方式详解
  8. 弄懂“进程”(上):3个组成部分、4个基本特征、4个基本状态
  9. css menu builder,AutoPlay Menu Builder使用教程【图文教程】
  10. 【Spring Security】五、自定义过滤器