python3单例模式,python单例模式应用场景

  python3单例模式,python单例模式应用场景

  单体模式单例模式(SingletonPattern)是一种常用的软件设计模式,主要目的是保证某一个类只有一个实例存在。想陪人的图,希望当一个类在整个系统中只能出现一个实例的时候,singleton对象能派上用场。

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

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

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

  # mysingleton.py class my _ singleton(object):def foo(self):passmy _ singleton=my _ singleton()复制代码将上述代码保存在文件my singleton . py中,然后这样使用:

  从我的singleton导入my _ singleton my _ singleton.foo()使用__new__复制代码为了让一个类只有一个实例,我们可以使用__new__来控制实例创建的过程。代码如下:

  类Singleton(object):_ instance=None def _ _ new _ _(cls,*args,**kw):如果不是cls。_instance: cls。_instance=super(Singleton,cls)。__new__(cls,* args,* * kw)返回cls。_ instance class my class(singleton):A=1复制代码。在上面的代码中,我们将类的实例与类变量instance关联起来。如果cls。_instance为None,创建实例,否则直接返回cls。_instance。

  实现如下:

  一=我的类()二=我的类()一==二真一是二真id(一),id(二)(4303862608,4303862608)使用decorator复制代码我们知道decorator可以动态修改一个类或函数的功能。在这里,我们还可以使用装饰器来装饰一个类,使它只能生成一个实例。代码如下:

  从functools导入wrapsdef Singleton(cls):Instances={ } @ wraps(cls)def getinstance(* args,**kw):如果cls不在Instances:Instances[cls]=cls(* args,* * KW)Return instance[CLS]Return GetInstance @ Singleton class my class(object):A=1复制上面的代码,我们定义一个decorator Singleton,它返回一个内部函数GetInstance,这个函数将确定一个类是否在字典实例中。如果不存在,它会将cls存储为键,将cls(*args,**kw)存储为实例中的值。否则,它将直接返回实例[cls]。

  使用元类元类可以控制创建类的过程。它主要做三件事:

  拦截类的创建,修改类的定义,并返回修改后的类。使用元类实现单例模式的代码如下:

  class Singleton(type):_ instances={ } def _ _ call _ _(cls,*args,**kwargs):如果cls不在cls中。_instances: cls_ instances[cls]=super(Singleton,cls)。__call__(*args,**kwargs)返回cls。_ instances[cls]# Python 2 class my class(object):_ _ metaclass _ _=Singleton # Python 3 # class my class(metaclass=Singleton):# Pass代码摘要Python的模块都是自然的Singleton模式,大多数情况下应该够用了。当然,我们也可以使用decorators、元类等方法。本文由funhacks在个人博客上发布,由Creative Commons采用-NC-ND 4.0(免费转载-保留签名-非商业-不扣款)协议发布。

  非商业转载请注明作者和出处。商业转载请联系作者本人。

  这篇文章的标题是:Python中的单例模式

  本文的链接是:funhacks.net/2017/01/17/…

  参考在Python中创建Singleton-Stack Overflow 酷壳设计模式-Python对newinit的使用?-堆栈溢出

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: