Python 什么是单体/博格模式?为什么不';他们不为我工作/我的观念哪里错了?
类似的问题已经被问过很多次了,但我在理解上有困难。我认为Singleton或Borg模式只能用于创建对象的一个实例,或者共享其状态。我有一个(正在运行的)测试示例,它并不像我期望的那样工作。要么代码不正确,要么我误解了singleton/borg模式的概念 我在文件Python 什么是单体/博格模式?为什么不';他们不为我工作/我的观念哪里错了?,python,singleton,instance,Python,Singleton,Instance,类似的问题已经被问过很多次了,但我在理解上有困难。我认为Singleton或Borg模式只能用于创建对象的一个实例,或者共享其状态。我有一个(正在运行的)测试示例,它并不像我期望的那样工作。要么代码不正确,要么我误解了singleton/borg模式的概念 我在文件borg.py中使用和模式创建了以下代码: class Singleton(object): _instance = None def __new__(class_, *args, **kwargs): if not
borg.py
中使用和模式创建了以下代码:
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
替换为MySingleton
,以使用Singleton而不是borg
现在,当我运行主代码时,我清楚地看到首先调用了modules.py
,向列表中添加了一个值。之后,Singleton/Borg模式也在主代码中实例化,并添加(另一个)值。我希望列表中有两个值(42和4711),而在列表中只有后一个值
可能的情况是,module.py
中的实例超出范围,因此,module.py
中执行的任何操作都已被删除。但我需要的是,无论我在哪里使用,都要有一个包含相同内容的对象
我怎样才能做到这一点?如何确保在创建对象MyBorg(或任何对象)的实例时,它在列表中包含值“42”,如在
module.py
中添加的那样?我应该使用什么模式/机制来实现这一点?您看到这种行为的原因是,在这两种情况下,每次执行实例=WhateverClass()
时都会调用\uuu init\uuuu
请注意,您正在传递相同的实例。但是,该实例在\uuu init\uuuu
中清除了它的\u列表
属性
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 Foo(Singleton):
def __init__(self):
self.data = []
pass
a = Foo()
a.data.append('Never see this')
b = Foo()
print a is b #True
print a.data # []
嗯,说得好。但在哪里将其设置为空列表?我需要知道第一个实例是什么时候创建的?或者在Singleton的
\uuuu new\uuuuuu
方法中对其进行硬编码?调整例如borg模式并改为写入\uuu共享状态={“u列表”:[]}
是否是一种好的做法?也就是说,在共享状态字典中初始化我需要的东西?我通常不认为单身是一件了不起的事情。在某些情况下,模块可以生成不错的单例(尽管您不能将其子类化)。您可以做的另一件事是将initialized
变量添加到Singleton API中。您需要在\uuuu new\uuuu
中设置class.\uu intstance.initialized=False。然后子类中的\uuuu init\uuuu
负责将self.initialized
设置为True
,如果self.initialized
为True,则不执行。