类似的问题已经被问过很多次,但我在理解它时遇到了问题。我在想 Singleton 或 Borg 模式可以用来创建一个对象的一个实例,或者共享它的状态。我有一个(工作)测试示例,它没有按我的预期工作。要么代码不正确,要么我误解了单例/博格模式的概念。
class Singleton(object):
_instance = None
def __new__(class_, *args, **kwargs):
if not isinstance(class_._instance, class_):
class_._instance = object.__new__(class_, *args, **kwargs)
return class_._instance
class MySingleton(Singleton):
def __init__(self):
self._list = []
def add(self,x):
self._list.append(x)
def get(self):
return self._list
class MyBorg(object):
__shared_state = {}
def __init__(self):
self.__dict__ = self.__shared_state
# and whatever else you want in your class -- that's all!
self._list = []
def add(self,x):
self._list.append(x)
def get(self):
return self._list
然后是一个文件module.py
from borg import MyBorg
myborg = MyBorg()
myborg.add(42)
print "just added something"
最后是主要代码:
from borg import MyBorg
import module
myborg = MyBorg()
myborg.add(4711)
print myborg.get()
应该在后两个类中替换MyBorg
byMySingleton
以使用 Singleton 而不是 borg。
现在,当我运行主代码时,我可以清楚地看到它modules.py
首先被调用,向列表中添加了一个值。之后,Singleton/Borg 模式也在主代码中被实例化,并且(另一个)值被添加。我希望列表中有两个值(42 和 4711),而不是列表中只有后一个值。
可能是 in 中的实例module.py
超出范围,因此所做的任何事情module.py
都已被删除。但我需要的是让一个对象包含相同的内容,无论我在哪里使用它。
我怎样才能做到这一点?我怎样才能确保,当我创建对象 MyBorg(或其他)的实例时,它包含列表中的值 '42',如添加module.py
?我应该使用什么模式/机制来实现这一目标?