python - 什么是单例/博格模式?为什么他们不适合我/我的概念哪里错了?

标签 python singleton instance

类似的问题已经被问过很多次了,但我在理解上遇到了问题。我认为 Singleton 或 Borg 模式可用于仅创建一个对象的一个​​实例,或共享其状态。我有一个(有效的)测试示例,但它没有按我的预期工作。要么代码不正确,要么我误解了 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 中添加的那样?我应该使用什么模式/机制来实现这一目标?

最佳答案

您所看到的行为的原因是,在这两种情况下,每次执行 instance = WhateverClass() 时都会调用 __init__

请注意,您正在传递同一个实例。但是,该实例正在 __init__ 中清除其 _list 属性。

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  # []

关于python - 什么是单例/博格模式?为什么他们不适合我/我的概念哪里错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15551904/

相关文章:

python - 使 .log 文件持久化

java - 单例用于多种用途?

ios - 我应该创建使用单例来与每个 View 共享数据还是只通过委托(delegate)传递数据?

python - 如何在 visual studio 中调试 python(如何进入库)?

python - 在 python selenium 中使用 get_attribute() 查找 xpath

python - Python 中的 ungetc

language-agnostic - 单例在编程中的用途

haskell - 在 Haskell 函数中返回类的实例

javascript - 类变量的 Javascript 等价物是什么?

php - 替换字符串的第二个实例