最近在考虑如何在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
但是,单例类可能有子类。
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)
要求是系统中只能有 1 个实例,即 Singleton、SingletonSub1 或 SingletonSub2。我该如何实现?我知道我绝对可以使用模块级变量来保存 Singleton 对象。但它确实是一个糟糕的代码......
最佳答案
使用字典来保存每个子类的实例
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 ]
关于python - Python 中带有子类的单例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21356659/