Python 什么是单体/博格模式?为什么不';他们不为我工作/我的观念哪里错了?

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

类似的问题已经被问过很多次了,但我在理解上有困难。我认为Singleton或Borg模式只能用于创建对象的一个实例,或者共享其状态。我有一个(正在运行的)测试示例,它并不像我期望的那样工作。要么代码不正确,要么我误解了singleton/borg模式的概念

我在文件
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,则不执行。