小编给大家分享一下python实现单例模式的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨方法吧!

Python单例模式的4种实现方法:

#-*-encoding=utf-8-*-print'----------------------方法1--------------------------'#方法1,实现__new__方法#并在将一个类的实例绑定到类变量_instance上,#如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回#如果cls._instance不为None,直接返回cls._instanceclassSingleton(object):def__new__(cls,*args,**kw):ifnothasattr(cls,'_instance'):orig=super(Singleton,cls)cls._instance=orig.__new__(cls,*args,**kw)returncls._instanceclassMyClass(Singleton):a=1one=MyClass()two=MyClass()two.a=3printone.a#3#one和two完全相同,可以用id(),==,is检测printid(one)#29097904printid(two)#29097904printone==two#Trueprintoneistwo#Trueprint'----------------------方法2--------------------------'#方法2,共享属性;所谓单例就是所有引用(实例、对象)拥有相同的状态(属性)和行为(方法)#同一个类的所有实例天然拥有相同的行为(方法),#只需要保证同一个类的所有实例具有相同的状态(属性)即可#所有实例共享属性的最简单最直接的方法就是__dict__属性指向(引用)同一个字典(dict)#可参看:http://code.activestate.com/recipes/66531/classBorg(object):_state={}def__new__(cls,*args,**kw):ob=super(Borg,cls).__new__(cls,*args,**kw)ob.__dict__=cls._statereturnobclassMyClass2(Borg):a=1one=MyClass2()two=MyClass2()#one和two是两个不同的对象,id,==,is对比结果可看出two.a=3printone.a#3printid(one)#28873680printid(two)#28873712printone==two#Falseprintoneistwo#False#但是one和two具有相同的(同一个__dict__属性),见:printid(one.__dict__)#30104000printid(two.__dict__)#30104000print'----------------------方法3--------------------------'#方法3:本质上是方法1的升级(或者说高级)版#使用__metaclass__(元类)的高级python用法classSingleton2(type):def__init__(cls,name,bases,dict):super(Singleton2,cls).__init__(name,bases,dict)cls._instance=Nonedef__call__(cls,*args,**kw):ifcls._instanceisNone:cls._instance=super(Singleton2,cls).__call__(*args,**kw)returncls._instanceclassMyClass3(object):__metaclass__=Singleton2one=MyClass3()two=MyClass3()two.a=3printone.a#3printid(one)#31495472printid(two)#31495472printone==two#Trueprintoneistwo#Trueprint'----------------------方法4--------------------------'#方法4:也是方法1的升级(高级)版本,#使用装饰器(decorator),#这是一种更pythonic,更elegant的方法,#单例类本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的defsingleton(cls,*args,**kw):instances={}def_singleton():ifclsnotininstances:instances[cls]=cls(*args,**kw)returninstances[cls]return_singleton@singletonclassMyClass4(object):a=1def__init__(self,x=0):self.x=xone=MyClass4()two=MyClass4()two.a=3printone.a#3printid(one)#29660784printid(two)#29660784printone==two#Trueprintoneistwo#Trueone.x=1printone.x#1printtwo.x#1


看完了这篇文章,相信你对python实现单例模式的方法有了一定的了解,想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!