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