Python下singleton模式的实现方法
很多开发人员在刚开始学Python时,都考虑过像c++那样来实现singleton模式,但后来会发现c++是c++,Python是Python,不能简单的进行模仿。
Python中常见的方法是借助global变量,或者class变量来实现单件。本文就介绍以decorator来实现singleton模式的方法。示例代码如下:
##-----------------------codebegin----------------------- #-*-coding:utf-8-*- defsingleton(cls): """Defineaclasswithasingletoninstance.""" instances={} defgetinstance(*args,**kwds): returninstances.setdefault(cls,cls(*args,**kwds)) returngetinstance ##1未来版Python支持ClassDecorator时可以这样用 classFoo(object): def__init__(self,attr=1): self.attr=attr Foo=singleton(Foo)##22.5及之前版不支持ClassDecorator时可以这样用 if__name__=="__main__": ins1=Foo(2)#等效于:ins1=singleton(Foo)(2) print"Foo(2)->id(ins)=%d,ins.attr=%d,%s"%(id(ins1),ins1.attr,('error','ok')[ins1.attr==2]) ins2=Foo(3) print"Foo(3)->id(ins)=%d,ins.attr=%d,%s"%(id(ins2),ins2.attr,('error','ok')[ins2.attr==2]) ins2.attr=5 print"ins.attr=5->ins.attr=%d,%s"%(ins2.attr,('error','ok')[ins2.attr==5]) ##------------------------codeend------------------------
输出:
Foo(2)->id(ins)=19295376,ins.attr=2,ok Foo(3)->id(ins)=19295376,ins.attr=2,ok ins.attr=5->ins.attr=5,ok