Python中父子类运行时共享全局配置变量的实现方法
实现跨父类与子类实例共享的动态全局配置变量pp
我需要一个能在运行时动态修改的全局配置变量pp,让它在父类和所有子类的实例之间共享。现有代码如下:
class Config: pp = 'Init' def __init__(self): pass class Child(Config): def __init__(self, name): self.cc = name par = Config() print(f"Parent: {par.pp}") par.pp = "123" print(f"Parent: {par.pp}") child = Child('XYZ') print(f"Child-1: {child.pp} - {child.cc}")
当前输出:
Parent: Init Parent: 123 Child-1: Init - XYZ
期望第三行输出为Child-1: 123 - XYZ,该如何简洁实现?
问题原因
直接执行par.pp = "123"时,是给par这个实例对象添加了一个名为pp的实例属性,它会覆盖类层面的Config.pp,但并没有修改Config类本身的pp属性。因此子类Child的实例仍然会读取类属性Config.pp的初始值Init。
解决方案
要实现全局共享,需要直接修改类属性而非实例属性。你自己找到的方法已经可以解决问题:
class Config: pp = 'Init' def __init__(self): pass def set_pp(self, val): type(self).pp = val
使用方式
调用实例的set_pp方法来修改类属性:
par = Config() print(f"Parent: {par.pp}") par.set_pp("123") print(f"Parent: {par.pp}") child = Child('XYZ') print(f"Child-1: {child.pp} - {child.cc}")
原理解释
type(self)会获取当前实例所属的类(对于Config实例来说就是Config类),直接修改该类的pp属性后,所有继承自Config的子类实例、以及后续创建的Config实例,都会读取到更新后的类属性值,从而实现全局共享。
更简洁的写法(可选)
如果不想额外定义方法,也可以直接通过类名修改类属性:
# 替代 par.pp = "123" Config.pp = "123"
这种方式同样能直接修改类属性,让所有实例共享更新后的值。
内容的提问来源于stack exchange,提问作者Tarek Eldeeb
相关产品推荐
相关产品推荐

