单例模式

使用模块

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

# mysingleton.py

class My_Singleton(object):

def foo(self):

pass

my_singleton = My_Singleton()

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

from mysingleton import my_singleton

my_singleton.foo()

1

2

3

from mysingleton import my_singleton

my_singleton.foo()

使用 __new__

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

class Singleton(object):

_instance = None

def __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

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

执行情况如下:

>>> one = MyClass()

>>> two = MyClass()

>>> one == two

True

>>> one is two

True

>>> id(one), id(two)

(4303862608, 4303862608)

使用装饰器

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

from functools import wraps

def 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

from functools import wraps

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

使用 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

python单例装饰器_python单例模式和装饰器相关推荐

  1. python单例类命名_单例模式(java/python/c++)

    序 最近接触到新项目,后端基于java开发.对于有c++/python开发经验,无java经验的小梅同学,开始了漫漫学习之旅,第一篇学习记录,从最简单的单例模式开始吧. 众所周知,单例模式的最明显的几 ...

  2. python grpc unary call错误_python的黑魔法-装饰器

    python的装饰器 装饰器 简单的来说就是函数的函数,在执行目标函数时,先执行装饰器函数,很像HOOk 简单的装饰器 实现一个打印日志的装饰器 def myLogger(func):def wrap ...

  3. 单例设计模式 序列化破坏单例模式原理解析及解决方案?

    单例设计模式 序列化破坏单例模式原理解析及解决方案? 序列化和反序列化 反射的破坏

  4. python单例_Python单例模式

    所谓单例,是指一个类的实例从始至终只能被创建一次,,而且自行实例化并向整个系统提供这个实例. 方法1 如果想使得某个类从始至终最多只有一个实例,使用__new__方法会很简单.Python中类是通过_ ...

  5. python单例_python 单例模式

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

  6. python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上

    Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...

  7. python什么是装饰器_python学习之装饰器是什么?

    学完python函数,接下来我们跟着猿人学python一起来看看什么是装饰器. 大家应该多多少少在其它地方有看过或是听过"装饰器"这个词.装饰器,顾名思义,就是用来装饰的,它装饰的 ...

  8. python单例设计模式(待补充)

    要点概论: 1. 理解单例设计模式 2. 单例模式中的懒汉式实例化 3. 模块级别的单例模式 4. Monostate单例模式 5. 单例和元类 6.单例模式Ⅰ 7. 单例模式Ⅱ 8. 单例模式的缺点 ...

  9. Python单例设计模式

    (1)为什么使用设计模式? 使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. (2)单例设计模式概念 让类创建的对象只有唯一的一个实例,即每次执行  类名() 返回的对象,内存地 ...

  10. python ---单例(Singleton)

    ''' 单例(Singleton) 单例是一种 设计模式 ,应用该模式的类只会生成一个实例. 单例模式保证了在程序的不同位置都 可以且仅可以取到同一个对象实例 :如果实例不存在,会创建一个实例:如果已 ...

最新文章

  1. 互联网协议 — NTP 时间同步协议
  2. 行业研究报告基本分析思路updated with 5c model
  3. 包转发、吞吐量、背板带宽计算
  4. 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变
  5. a标签跳到另一个页面指定选项卡_HTML常用标签
  6. Flink中的状态管理
  7. JAVA设计模式Design Pattern→单例模式Singleton Pattern、工厂模式Factory Pattern、代理模式Proxy Pattern
  8. VMware Workstation 12 安装小于4GB的GHOST 64位win7系统
  9. Popclip插件:任务自动添加进 Microsoft ToDo的任务列表
  10. MATLAB-数据插值
  11. 机器学习笔记 - 探索性数据分析(EDA) 学习进阶
  12. 唯物主义观点有哪些_唯物主义的观点及方法论有哪些?
  13. 大数据营销在电商领域的应用案例
  14. 生活中,如何学会放下
  15. Hyper-V的使用技巧及管理方法
  16. TB级倾斜摄影建模集群完美硬件配置方案
  17. 元宇宙时空——元宇宙是什么
  18. 多模态模型 CLIP4Clip 带你实现文本与视频互搜
  19. POJ3426 ACM Computer Factory——最大流(EK+输出路径)
  20. 差异表达基因热图怎么看_获得差异表达基因后-基因功能注释

热门文章

  1. 宁夏政务网 紫图高拍仪控件和文件上传控件的若干问题及解决方法
  2. 关于ioncube的license破解
  3. 计算机一级误差怎么计算,(excel最大偏差公式)偏离值怎么计算
  4. 荆州水文水位查询_长江水位实时查询网(长江水位公告实时查询)
  5. C/C++实现atoll函数
  6. 56个民族静态字典代码创建sql语句
  7. 云呐|国有资产管理信息系统,资产管理信息系统功能描述
  8. PyRadiomics工具包使用说明
  9. C#类库封装SDK调用:一个函数就能实现相应功能,省得你花时间去研究底层了,使用超级简单
  10. Eplan执行翻译操作详细教程