单例模式的实现有很多种方法,下面列出来在学习过程中遇到的其中几个方法以及在实现过程中的问题
本文没有对具体模块的作用进行说明,可以百度,只记录自己认为重要的东西
1.使用模块的方法,略
2.装饰器
def singleton(cls):
_instance = {}
def _wrapper(*args, **kwargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kwargs)
return _instance[cls]
# 下面这种写法是错误的,__instance为外部作用域,是只读,修改其值会将其变成局部变量,第二次再判断的时候会出现变量未找到,报错
# _instance = None
# if _instance is None:
# _instance = cls(*args, **kwargs) # 这里修改了_instance的值将其变成了局部变量,而上一句判断则会报错
# return _instance
return _wrapper
@singleton
class A(object):
def __init__(self, name):
self.name = name
a = A('jack')
a.x =1
b = A('tom')
b.x = 2
print(b.x)
print(a.x)
print("a is b :", a is b)
print(a.name)
print(b.name)
"""结果
2
2
a is b : Tru