我使用以下解决方案来维护类实例列表: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相同的实例。这不起作用。我的代码出了什么问题?
编辑:好的,所以事实证明我正在寻找单身模式,但无法自己重新创建。任何人都可以解释为什么我的代码不起作用吗?
答案 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