python装饰器之编写类的装饰器
使用类的装饰器实现单例模式:
方法1:
使用全局的变量:
instances={}
def tracer(aclass):
def onCall(*args,**kwargs):
if aclass not in instances:
instances[aclass]=aclass(*args,**kwargs)
return instances[aclass]
return onCall
方法2:
使用局部变量:
def tracer(aclass):
instance=None
def onCall(*args,**kwargs):
nonlocal instance
if instance is None:
instance=aclass(*args,**kwargs)
return instance
return onCall
方法3:
使用函数的属性
def tracer(aclass):
def onCall(*args,**kwargs):
if onCall.instance in None:
onCall.instance=aclass(*args,**kwargs)
return onCall.instance
onCall.instance=None
return onCall
方法4:
使用类来写装饰器实现
class tracer:
def __init__(self,aclass):
self.aclass=aclass
self.instance=None
def __call__(self,*args,**kwargs):
if self.instance is None:
self.instance=self.aclass(*args,**kwargs)
return self.instance