Python中self属性与Borg模式继承问题:实例缺失latitude属性报错
问题原因及解决方案
问题根源
报错的核心原因是父类BorgSingleton的__init__方法替换了实例的属性字典,导致子类先设置的属性丢失:
- 在
Point的__init__中,你先给self.latitude和self.longitude赋值,此时这些属性存放在实例默认的__dict__里。 - 随后调用
super().__init__(),父类里的self.__dict__ = self._shared_borg_state把当前实例的属性字典替换成了类共享的空字典_shared_borg_state,之前设置的latitude和longitude自然就找不到了。
修复方案
调整super().__init__()的调用顺序,先执行父类初始化绑定共享字典,再设置属性,这样属性会直接存入共享字典中:
class BorgSingleton: _shared_borg_state = {} test = "toto" def __init__(self): self.__dict__ = self._shared_borg_state print("borg created") print(self.test) class Point(BorgSingleton) : def __init__(self, lat, long): # 先绑定共享字典 super().__init__() # 再设置属性,此时属性会存入共享字典 self.latitude = lat self.longitude = long print(self.latitude) def g(self) : return BorgSingleton.test +" "+str(self.latitude) + " " + str(self.longitude) def main(): point_1 = Point(5,2) point_2 = Point(3,3) print(point_1.g()) print(point_2.g()) point_1.test = "tata" print(point_1.g()) print(point_2.g()) if (__name__ == "__main__"): main()
修复后运行结果
borg created toto 5 borg created tata 3 toto 3 3 toto 3 3 tata 3 3 tata 3 3
注意:Borg模式的核心是共享属性字典,所以后续创建的point_2会覆盖point_1的latitude和longitude,这是该模式的预期行为。
内容的提问来源于stack exchange,提问作者CharlyG
相关产品推荐
相关产品推荐

