实现单例模式的两种方式:
1.装饰器实现单例模式: 构建一个字典存放实例化出来的对象, 判断是否存在, 如果存在直接返回, 不存在调用类实例化返回.
2. 类实现单例模式: 重写__new__()方法, 在调用__new__()方法前进行判断是否有实例对象, 有就直接进行返回, 不再生成,没有就调用父类的__new__()方法生成,并修改__instance的值进行返回.
代码:
# 两种方式实现单例模式
# 1.使用装饰器实现单例模式
def wrap(cls):
# 定义一个字典存放第一次创建出来的实例对象
instance = {}
def inner(*args, **kwargs):
if cls not in instance: # 如果不在,进行添加, 在的话直接进行反回生成的对象
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return inner
@wrap
class Single(object):
def __init__(self):
# 初始化实例对象
pass
master = Single()
slave1 = Single()
slave2 = Single()
print(id(master)) # 139728354417856
print(id(slave1)) # 139728354417856
print(id(slave2)) # 139728354417856
# 2.类实现单例模式
class Single(object):
__instance = None
__init = True
def __init__(self):
if self.__init is True:
# 初始化实例对象后
self.__init = False
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = object.__new__(cls)
return cls.__instance
master = Single()
slave1 = Single()
slave2 = Single()
print(id(master)) # 140453004217648
print(id(slave1)) # 140453004217648
print(id(slave2)) # 140453004217648