Python中Borg设计模式原理解析:Singleton调用Borg.__init__的作用
理解Borg模式中
Borg.__init__()的作用 我来给你把这个逻辑拆解得明明白白——核心就绕着Python对象的__dict__属性转,这个属性是每个实例用来存储自身所有属性的字典。
先看Borg类的定义:它有一个类变量_shared_state,这个变量是所有Borg(包括继承它的Singleton)实例共享的,因为类变量属于类本身,不是某个实例独有的。
当Singleton的__init__方法调用Borg.__init__(self)时,发生了最关键的一步:把当前Singleton实例的__dict__直接替换成了Borg类的_shared_state字典。
咱们用实际创建实例的过程来一步步看:
当你创建第一个Singleton实例:
s1 = Singleton(name="Alice")- 先执行
Borg.__init__(self),此时s1的__dict__不再是自己默认的空字典,而是指向了Borg的_shared_state(这时这个共享字典还是空的) - 接着执行
self._shared_state.update(kwargs),把{"name": "Alice"}加到共享字典里 - 因为
s1的属性都存在这个共享字典里,所以s1.name就能拿到"Alice"
- 先执行
当你创建第二个Singleton实例:
s2 = Singleton(age=30)- 同样先调用
Borg.__init__(self),把s2的__dict__也指向同一个_shared_state字典(现在里面已经有{"name": "Alice"}了) - 然后执行update,把
{"age":30}合并进去,共享字典变成{"name": "Alice", "age":30} - 这时候你去访问
s1.age会得到30,访问s2.name也能得到"Alice"——两个实例完全共享所有属性
- 同样先调用
这里有个很重要的点要区分:Borg模式和传统单例不一样,它的实例是不同的对象(你可以打印s1 is s2,结果是False),但它们的状态完全共享,这就是Borg模式的核心特点。
给你跑一段代码直观感受下:
s1 = Singleton(name="Alice") print(s1) # 输出: {'name': 'Alice'} s2 = Singleton(age=30) print(s1) # 输出: {'name': 'Alice', 'age': 30} print(s2) # 输出: {'name': 'Alice', 'age': 30} print(s1 is s2) # 输出: False
总结一下:Borg.__init__(self)的作用就是把当前实例的属性存储容器替换成类级别的共享字典,让所有继承自Borg的实例都能共享状态,哪怕它们是不同的对象实例。
内容的提问来源于stack exchange,提问作者aca06
相关产品推荐
相关产品推荐

