为什么Python-Borg/Singleton模式起作用

2024-04-27 10:43:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是在网上跌跌撞撞地发现了以下有趣的代码:

http://code.activestate.com/recipes/66531/

class Borg:
    __shared_state = {}
    def __init__(self):
        self.__dict__ = self.__shared_state
    # and whatever else you want in your class -- that's all!

我理解单例是什么,但我不明白被截取的特定代码。 你能解释一下“共享状态”是如何/在哪里被改变的吗?在

我在ipython里试过了:

^{pr2}$

但不能完全理解这是怎么发生的。在


Tags: and代码selfcomhttpinitdefcode
3条回答

这些实例是独立的对象,但是通过将它们的__dict__属性设置为相同的值,这些实例具有相同的属性字典。Python使用属性字典来存储一个对象上的所有属性,因此实际上这两个实例的行为方式是相同的,因为它们的属性的每一个更改都是在共享属性字典中进行的。在

但是,如果使用is来测试相等性(浅层相等),那么这些对象仍然会比较不相等,因为它们仍然是不同的实例(很像个体的博格无人机,它们共享他们的思想,但在物理上是不同的)。在

因为类的实例的__dict__被设置为__share_statedict,它们指向同一个对象。(Classname.__dict__包含所有类属性)

当您这样做时:

b1.foo = "123"

您正在修改dict,这两个b1.__dict__和{}都引用了。在

实例化任何对象后调用的__init__方法用类属性__shared_state替换新创建对象的__dict__属性。在

a.__dict__b.__dict__和{}都是同一个对象。注意,当从类外部访问private属性时,我们必须添加隐式前缀_Borg。在

In [89]: a.__dict__ is b.__dict__ is Borg._Borg__shared_state
Out[89]: True

相关问题 更多 >