Singleton 单例模式

  • 单例是一种设计模式,应用该模式的类只会生成一个实例。对外提供一个全局访问点(例如配置文件)

  • 使用函数装饰器实现单例

  • 使用类装饰器实现单例

  • 使用 new 关键字实现单例

  • 使用 metaclass 实现单例

重写 new 方法
class Singleton:
    _obj = None
    _init_flag = True

    def __new__(cls, *args, **kwargs):
        if cls._obj == None:
            cls._obj = object.__new__(cls)

        return cls._obj

    def __init__(self, name):
        if Singleton._init_flag:
            print('init......')
            self.name = name
            Singleton._init_flag = False


a = Singleton('a')
b = Singleton('b')

print(a)
print(b)
使用装饰器实现
def singleton(cls):
    _obj = {}

    def inner(*args, **kwargs):
        if cls not in _obj:
            _obj[cls] = cls()
        return _obj[cls]

    return inner


@singleton
class Cls:
    def __init__(self,):
        print('init...')
        pass


a = Cls()
b = Cls()

print(a)
print(b)
类装饰器实现
class Singleton:
    def __init__(self, cls):
        self.cls = cls
        self.obj = {}

    def __call__(self, *args, **kwargs):
        if self.cls not in self.obj:
            self.obj[self.cls] = self.cls()
        return self.obj[self.cls]


@Singleton
class Cls:
    def __init__(self):
        print('init...')


a = Cls()
b = Cls()
print(a)
print(b)
posted @ 2022-03-26 10:35  愺様  阅读(23)  评论(0编辑  收藏  举报