Singleton Pattern

使用函数装饰器实现单例

使用不可变的类地址作为键,其实例作为值,每次创造实例时,首先查看该类是否存在实例,存在的话直接返回该实例即可,否则新建一个实例并存放在字典中。

def singleton(cls):
    _instance = {}
    def inner():
        if cls not in _instance:
            _instance[cls] = cls()
        return _instance[cls]
    return inner
    
@singleton
class A(object):
    def __init__(self):
        pass

#test
cls1 = A()
cls2 = A()
print(id(cls1) == id(cls2))

使用类装饰器实现单例

使用 __new__ 关键字实现单例

在理解到 __new__ 的应用后,理解单例就不难了,这里使用了

来存放实例,如果 _instance 为 None,则新建实例,否则直接返回 _instance 存放的实例。

使用 metaclass 实现单例

同样,我们在类的创建时进行干预,从而达到实现单例的目的。

在实现单例之前,需要了解使用 type 创造类的方法,代码如下:

以上,我们使用 type 创造了一个类出来。这里的知识是 mataclass 实现单例的基础。

这里,我们将 metaclass 指向 Singleton 类,让 Singleton 中的 type 来创造新的 Cls4 实例。

Last updated