You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:25:16