Python 中带有子类的单例

Wei*_*Wei 5 python singleton subclass

最近,我在考虑如何用Python实现单例模式。如果 Singleton 类没有子类,下面的代码可以正常工作。

class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance
Run Code Online (Sandbox Code Playgroud)

但是,Singleton 类可能有子类。

class SingletonSub1(Singleton):
    def __new__(cls, *args, **kwargs):
        return super(SingletonSub1, cls).__new__(cls, *args, **kwargs)

class SingletonSub2(Singleton):
    def __new__(cls, *args, **kwargs):
        return super(SingletonSub1, cls).__new__(cls, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

要求是系统中只能有 1 个实例,即 Singleton、SingletonSub1 或 SingletonSub2。我怎样才能实现这个?我知道我绝对可以使用模块级变量来保存 Singleton 对象。但这确实是一个糟糕的代码......

小智 4

使用字典来保存每个子类的实例

class Singleton(object):
    _instances = {}

    def __new__(cls, *args, **kwargs):
        if cls._instances.get(cls, None) is None:
            cls._instances[cls] = super(Singleton, cls).__new__(cls, *args, **kwargs)

        return Singleton._instances[cls]
Run Code Online (Sandbox Code Playgroud)