python设计模式之单例模式你了解多少

python设计模式之单例模式你了解多少

目录

单例模式

概念

单例模式使用场景

python实现单例模式 

总结

单例模式 概念 单例模式:“保证一个类仅有一个实例,并提供一个访问它的在这里插入代码片全局访问点。 单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 单例模式应用的场景一般发现在以下条件下: (1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。 (2)控制资源的情况下,方便资源之间的互相通信。如线程池等。 单例模式使用场景 - Web应用的配置对象的读取 - Windows的Task Manager(任务管理器) - 网站的计数器,一般也是采用单例模式实现,否则难以同步 - 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加 - 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源 - 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。 - python实现单例模式 

函数装饰器实现单例

def singleton(class_): instances = {) def get_instance(*args, **kwargs): if class_ not in instances: instances[class_] = class_(*argx, **kwargs) return instances[class_] reyurn get_instance @singleton class Cls(object): def __init__(self): pass cls1 = Cls() cls2 = Cls() print(id(cls1) == id(cls2))

输出结果:

True

instances = {)

使用不可变的类地址作为键,其实例作为值,每次创造实例时,首先查看该类是否存在实例,存在的话直接返回该实例即可,否则新建一个实例并存放在字典中。

使用模块 (常用)实现单例

作为python的模块是天然的单例模式

# mysingleton.py class My_Singleton(object): def foo(self): pass my_singleton = My_Singleton() # to use from mysingleton import my_singleton my_singleton.foo()

基于__new__实现的单例模式(最常用)

类(class)通过方法 new 创造了实例(instance)

class Single(object): _instance = None def __new__(cls, *args, **kw): if cls._instance is None: orig = super(Single, cls) cls._instance = orig.__new__(cls, *args, **kw) return cls._instance def __init__(self): pass single1 = Single() single2 = Single() print(id(single1) == id(single2))

如果 _instance 为 None,则新建实例,否则直接返回 _instance 存放的实例。

使用 metaclass 实现单例模式

元类(metaclass) 可以通过方法 metaclass 创造了类(class)

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] class Cls4(metaclass=Singleton): pass cls1 = Cls4() cls2 = Cls4() print(id(cls1) == id(cls2))

我们将 metaclass 指向 Singleton 类,让 Singleton 中的 type 来创造新的 Cls4 实例

web应用配置文件单例实现

def singleton(class_): instances = {} def getinstance(*args, **kwargs): if class_ not in instances: instances[class_] = class_(*args, **kwargs) return instances[class_] return getinstance @singleton class Config(dict): """ 配置文件类 单例模式 """ def __init__(self): self.__can_import = True self.__init_default() dict.__init__(self) def __init_default(self): self['debug'] = False self['autoreload'] = True @property def can_import(self): return self.__can_import def import_dict(self, **kwargs): if self.__can_import: for k, v in kwargs.items(): self[k] = v self.__can_import = False else: raise Exception('ConfigImportError') def clear(self): self.__can_import = True dict.clear(self) self.__init_default() 总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注易知道(ezd.cc)的更多内容!      

推荐阅读

    Python之可迭代对象、迭代器、生成器

    Python之可迭代对象、迭代器、生成器,迭代,生成器,一、概念描述可迭代对象就是可以迭代的对象,我们可以通过内置的iter函数获取其迭代器,可

    应用程序对象

    应用程序对象,,应用程序对象是一个应用程序级对象,用于在所有用户之间共享信息,并且在Web应用程序运行期间可以保存数据。 应用的性质: 方法

    1.设计模式概述

    1.设计模式概述,模式,原则,[toc]1.为什么要使用设计模式使用设计模式可以重构整体架构代码、提交代码复用性、扩展性、减少代码冗余问题。

    Java创建对象的几种方式

    Java创建对象的几种方式,对象,方法,本文目录Java创建对象的几种方式java中几种创建对象的方式1Java中创建对象的集中方式有那些JAVA创建对

    wps快速的编辑图层|WPS巧用对象图层

    wps快速的编辑图层|WPS巧用对象图层,图层,编辑,快速,wps,1.WPS 如何巧用对象图层一、认识对象图层工具及按纽1、您可以在插件工具栏中可以