Python如何跨文件修改类实例变量及解决修改不生效问题
问题原因
当你直接执行python test2.py时,test2.py会被Python解释器标记为__main__模块,此时在代码顶层执行var = toto()创建的实例属于__main__模块的全局变量。
而test1.py中执行import test2时,Python不会复用当前运行的__main__模块,会把test2.py作为独立的test2模块重新加载执行一次,会再次运行var = toto()创建一个全新的实例。所以test1修改的是test2模块下的var.a,而test2的main函数中访问的是__main__模块下的var,二者是内存中完全独立的两个对象,修改自然不会生效。
解决方法
推荐以下三种常用方案:
方案1:拆分入口文件(最规范,推荐使用)
把业务逻辑和执行入口拆分,避免test2被直接作为入口运行,消除模块重复加载的问题。
- 新增
main.py作为唯一执行入口:
import test1 import test2 if __name__ == '__main__': print('start') test2.var.func() # 输出11 test1.doit() test2.var.func() # 输出15
- 删掉test2.py中的main函数和
if __name__ == '__main__'相关代码即可,test1.py、test2.py其余代码保持不变。
方案2:修改test1的引用逻辑(适合不想调整文件结构的场景)
直接让test1引用当前运行的__main__模块下的var实例,无需重新导入test2模块:
修改test1.py代码为:
import sys def doit(): sys.modules['__main__'].var.a = 5
该方案不需要修改test2.py的代码,直接运行python test2.py即可得到预期结果,但模块耦合度较高,只适合临时调试使用。
方案3:参数传递(耦合度最低)
调整代码结构,避免跨模块直接修改全局变量,通过参数传递实例对象:
- 修改
test1.py代码:
def doit(var): var.a = 5
- 修改test2.py中调用doit的逻辑:
test1.doit(var) # 把当前模块的var实例作为参数传入
内容的提问来源于stack exchange,提问作者Stéphane REY
相关产品推荐
相关产品推荐

