Python如何避免循环导入,实现跨脚本类访问变量?
问题解决:跨模块访问变量报错
AttributeError 问题根源
master_la.py里的global dname仅做声明,只有调用CommonSetup.get_device()方法时才会给dname赋值,且原方法定义存在语法错误(缺少括号与self参数)。- 模块加载阶段,
dname并未被初始化到模块的属性空间中,直接访问master_la.dname自然会触发属性不存在的错误。
解决方案(均避免循环导入)
方案1:直接初始化模块级变量(最简单)
修改master_la.py,在模块级别直接定义变量,无需依赖类方法:
# master_la.py dname = "BNV023" # 模块级别直接初始化变量 class CommonSetup: # 若需动态更新变量,保留方法 def get_device(self): global dname dname = "BNV023" # 可在此处动态修改值
此时salve_la.py的原有代码即可正常运行,因为模块加载时dname已存在。
方案2:用类属性替代全局变量(更符合面向对象规范)
将dname设为CommonSetup的类属性,摒弃全局变量:
# master_la.py class CommonSetup: dname = "BNV023" # 定义类属性 def get_device(self): # 若需动态更新,直接修改类属性 CommonSetup.dname = "BNV023"
修改salve_la.py的访问方式:
# salve_la.py from foo.bar import master_la class LaUtils: name = master_la.CommonSetup.dname
方案3:通过模块方法动态获取(适合变量需动态生成的场景)
如果dname无法提前初始化,可在master_la.py中提供模块级方法确保变量被赋值:
# master_la.py dname = None # 先初始化模块变量 class CommonSetup: def get_device(self): global dname dname = "BNV023" # 模块级方法:确保变量初始化后再返回 def get_dname(): if dname is None: CommonSetup().get_device() return dname
修改salve_la.py调用方法获取值:
# salve_la.py from foo.bar import master_la class LaUtils: name = master_la.get_dname()
额外注意
- 原代码中
def get_device:是语法错误,必须修正为def get_device(self):(类的实例方法必须包含self参数)。 - 避免循环导入的核心是:不要让
master_la.py与salve_la.py互相导入。若需双向共享数据,可将变量抽离到独立的config.py模块,两个脚本均导入该模块即可。
内容的提问来源于stack exchange,提问作者mac
相关产品推荐
相关产品推荐

