如何在Python中跨所有导入实例动态更新模块变量?
符合Python风格的动态模块变量实现方案
方案1:直接通过模块访问变量(最简洁)
这是Python中管理模块动态变量的标准方式,所有导入的模块别名都会指向同一个模块对象,修改模块属性后,所有引用都会同步更新。
模块代码(foo/__init__.py)
foo = 'some' def update_foo(val): global foo foo = val
使用示例
import foo import foo as f print(foo.foo) # 输出 'some' print(f.foo) # 输出 'some' foo.update_foo('other') print(foo.foo) # 输出 'other' print(f.foo) # 输出 'other'
方案2:用可变对象封装(支持直接引用变量名)
如果希望无需模块前缀,直接通过foo变量名访问并同步更新,可以用自定义可变对象封装值。利用Python的对象引用特性,导入的变量指向同一个实例,修改实例内部值时所有引用都会同步。
模块代码(foo/__init__.py)
class _MutableStr: def __init__(self, initial_value): self.value = initial_value def __str__(self): return self.value def __repr__(self): return repr(self.value) foo = _MutableStr('some') def update_foo(val): foo.value = val
使用示例
from foo import foo, update_foo print(foo) # 输出 'some' update_foo('other') print(foo) # 输出 'other'
原理说明
- 方案1中,模块本身是一个对象,
foo是模块的属性。无论用什么别名导入模块,都会指向同一个模块对象,修改属性后所有访问都会获取最新值。 - 方案2中,
foo是一个自定义实例,导入的是该实例的引用。修改实例的value属性不会改变引用本身,因此所有导入该实例的地方都会同步看到更新,且直接打印实例就能显示当前值。
内容的提问来源于stack exchange,提问作者Mohamedneyaz Basheer
相关产品推荐
相关产品推荐

