如何在Python中始终使用相同的类实例?

时间:2015-04-17 11:24:38

标签: python class singleton instance self

我使用以下解决方案来维护类实例列表:https://stackoverflow.com/a/12102163

现在我想使用该列表来确保始终只有一个类的实例。更新的类初始化应返回一个现有实例。

我的代码是:

class MyClass:

    instances = []

    def __init__(self):
        if not MyClass.instances:
            self.data=1234
        else:
            self = MyClass.instances[0]

所以:

>> a=MyClass()
>> a.data
1234

并且b = MyClass()应该返回与a相同的实例。这不起作用。我的代码出了什么问题?

编辑:好的,所以事实证明我正在寻找单身模式,但无法自己重新创建。任何人都可以解释为什么我的代码不起作用吗?

2 个答案:

答案 0 :(得分:0)

继续你的代码行和你的风格。您可以进行以下修改: -

class MyClass:
    instance = None
    def __init__(self):
        self.data=1234
        MyClass.instance = self

def get_myclass():
    if MyClass.instance:
        return MyClass.instance
    return MyClass()

get_myclass将是一个用于创建类对象的包装函数。尝试代码。

>>> import instance
>>> a=instance.get_myclass()
>>> b=instance.get_myclass()
>>> a is b
True

答案 1 :(得分:0)

这是Singleton元类配方的一个例子。这个例子来自Ch。 The Python Cookbook中的9个。

class Singleton(type):
    def __init__(self, *args, **kwargs):
        self.__instance = None
        super().__init__(*args, **kwargs)

    def __call__(self, *args, **kwargs):
        if self.__instance is None:
            self.__instance = super().__call__(*args, **kwargs)
            return self.__instance
        else:
            return self.__instance

# Example
class Spam(metaclass=Singleton):
    def __init__(self):
        print('Creating Spam')


if __name__ == '__main__':
    a = Spam()
    b = Spam()
    assert a is b