上一节使用new方法实现了单例模式,其实还可以使用装饰器来实现单例模式:
1.使用函数装饰器实现单例模式:
#单例模式
instance = None
def single(func):
def single_in():
global instance
if not instance:
instance=object.__new__(func)
return instance
else:
return instance
return single_in
@single
class Myclass(object):
def fun(self):
print('----fun----')
a=Myclass()
a.fun()
a1=Myclass()
a1.fun()
print(id(a),id(a1))
2.使用类装饰器实现单例模式:
class single():
instance=None
def __init__(self,func):
print('---init---')
self.func = func
def __call__(self, *args, **kwargs):
print('---call---')
if not self.instance:
self.instance=super().__new__(self.func)
return self.instance
else:
return self.instance
return self.func()
@single
class Myclass(object):
def fun(self):
print('----fun----')
a=Myclass()
a.fun()
a1=Myclass()
a1.fun()
print(id(a),id(a1))
运行结果:
---init---
---call---
----fun----
---call---
----fun----
2195558079112 2195558079112