Python装饰器实现单例
单例目的在于创建对象时总是产生同一个对象,并不会创建新的。利用装饰器,可以在类本身不改变的前提下,将此类改为单例模式。
利用nonlocal
实现单例
def Singleton(cls):
_instance = None
def _singleton(*args, **kargs):
nonlocal _instance
if _instance is None:
_instance = cls(*args, **kargs)
return _instance
return _singleton
@Singleton
class A:
pass
for i in range(3):
a = A()
print(a)
输出:
<__main__.A object at 0x000001A47CBC0BE0>
<__main__.A object at 0x000001A47CBC0BE0>
<__main__.A object at 0x000001A47CBC0BE0>
nonlocal
是python3.0才可使用。
非nonlocal
实现单例
def Singleton(cls):
_instance = {}
def _singleton(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls]
return _singleton
@Singleton
class A:
pass
for i in range(3):
a = A()
print(a)
输出:
<__main__.A object at 0x000001434A3B9198>
<__main__.A object at 0x000001434A3B9198>
<__main__.A object at 0x000001434A3B9198>
其实nonlocal
解决了内嵌函数的作用域问题,内嵌函数无法修改上层函数的变量,nonlocal
意味着它们位于一个嵌套的函数中。
初学python,如对知识点理解有误还请指正。欢迎补充不足之处,看到后我会及时补充进文章中。
网友评论