Python用装饰器和类实现单例模式

实现单例模式的两种方式:

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

 

你可能感兴趣的:(python学习)