如何在Python多个类实例之间共享同一个属性?
类实例共享属性的实现方法
原代码问题分析
你当前编写的代码无法实现预期的共享效果,运行时实际输出为None而非你注释标注的lala,原因是:
当你执行foo1.title = "lala"赋值操作时,Python不会修改类层面定义的title属性,而是会给foo1这个实例单独创建一个同名的实例属性,类本身的属性以及其他实例的访问逻辑都不受影响,自然无法实现全实例共享。
可用实现方案
方案1:直接操作类属性修改
类属性本身就是所有实例共享的,只要不单独给实例创建同名属性,所有实例访问的都是类属性的最新值,你只需要把对实例的赋值改为对类的赋值即可:
class Foo: title = None def print(self): return self.title if __name__ == "__main__": foo1 = Foo() # 直接修改类属性,所有实例都会同步生效 Foo.title = "lala" foo2 = Foo() print(foo2.print()) # 输出 lala
方案2:封装属性操作,实现实例修改也能全局同步
如果你希望通过实例修改属性时也能同步到所有实例,可以用property装饰器封装属性的读写逻辑,强制所有赋值操作都修改类层面的属性:
class Foo: # 内部存储用私有类属性 _title = None @property def title(self): # 读取时统一返回类属性 return Foo._title @title.setter def title(self, value): # 赋值时统一修改类属性 Foo._title = value def print(self): return self.title if __name__ == "__main__": foo1 = Foo() # 通过实例赋值也会修改全局共享的类属性 foo1.title = "lala" foo2 = Foo() print(foo2.print()) # 输出 lala
内容的提问来源于stack exchange,提问作者yui amanda
相关产品推荐
相关产品推荐

