Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 防止初始化扩展单例类的类_Python_Inheritance_Singleton - Fatal编程技术网

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>
>>>