Python 防止初始化扩展单例类的类
我想防止继承类的多次实例化。单例模式似乎适合这个任务,但我没有得到我预期的结果 这是我的代码示例:Python 防止初始化扩展单例类的类,python,inheritance,singleton,Python,Inheritance,Singleton,我想防止继承类的多次实例化。单例模式似乎适合这个任务,但我没有得到我预期的结果 这是我的代码示例: class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwar
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class Config(metaclass=Singleton):
def __init__(self):
print('initialized')
class DevelopConfig(Config):
pass
class TestingConfig(Config):
pass
foo = DevelopConfig()
bar = TestingConfig()
执行此操作时,我希望看到一个“初始化”作为输出,但它出现了两次。有没有关于如何防止这些类的多个实例的想法?我错过了什么
编辑:最终目标是防止多个并发配置。如果有更聪明的方法,我很乐意听到。你所经历的主要问题是
cls
实际上不是你所想的。仅仅因为变量名为cls
,并不意味着它是类对象,在本例中,它实际上是创建的对象self
如果将print
语句添加到Singleton类中,则可以看到这一点:
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
print(cls)
#etc...
>>> foo = DevelopConfig()
<class '__main__.DevelopConfig'>
initialized
>>> bar = TestingConfig()
<class '__main__.TestingConfig'>
initialized
这将产生:
>>> foo = DevelopConfig()
initialized
>>> bar = TestingConfig()
>>> foo
<__main__.DevelopConfig object at 0x00000259CE2FD080>
>>> bar
<__main__.DevelopConfig object at 0x00000259CE2FD080>
>>>
>foo=DevelopConfig()
初始化
>>>bar=TestingConfig()
>>>福
>>>酒吧
>>>
谢谢。完美答案。:)
>>> foo = DevelopConfig()
initialized
>>> bar = TestingConfig()
>>> foo
<__main__.DevelopConfig object at 0x00000259CE2FD080>
>>> bar
<__main__.DevelopConfig object at 0x00000259CE2FD080>
>>>