Python导入自定义模块后类实例无法访问其他实例变量如何解决
问题根本原因
- 你写的
B.addition方法硬编码引用了全局变量object_1,Python解析变量时会优先查找方法所在模块的全局作用域,而非调用方模块的全局作用域。 - 当
Experiment_1作为主程序运行时,if __name__ == '__main__'块会执行,object_1会被注册到Experiment_1的全局作用域中,因此可以正常访问。 - 当
Experiment_1作为模块被导入时,if __name__ == '__main__'块不会执行,Experiment_1的全局作用域中不存在object_1变量;即使你在Experiment_2中定义了同名的object_1,它属于Experiment_2的全局作用域,和Experiment_1的全局作用域完全隔离,因此会触发NameError。
这种硬编码全局变量的写法本身就存在强耦合问题,即使作为主程序能运行,也不推荐使用。
解决方案
正确的做法是通过参数传递依赖的实例,避免硬编码全局变量,推荐两种修改方式:
方式1:调用方法时传入A类实例
修改Experiment_1中B类的定义:
# Experiment_1 class A(): def process1(self): self.x=10 def process2(self): self.y=20 class B(): # 新增参数接收A类实例 def addition(self, a_instance): summed = a_instance.x + a_instance.y print(summed) if __name__ == '__main__': object_1=A() object_2=B() object_1.process1() object_1.process2() # 调用时传入实例 object_2.addition(object_1)
对应的Experiment_2代码调整为:
# Experiment_2 from Experiment_1 import A, B object_1=A() object_2=B() object_1.process1() object_1.process2() # 传入当前模块的A实例 object_2.addition(object_1)
方式2:B类初始化时绑定A类实例
如果多个方法都需要用到A实例,可以在初始化时传入并保存为属性:
修改Experiment_1中B类的定义:
# Experiment_1 class A(): def process1(self): self.x=10 def process2(self): self.y=20 class B(): # 初始化时接收A实例并保存为属性 def __init__(self, a_instance): self.a_instance = a_instance def addition(self): summed = self.a_instance.x + self.a_instance.y print(summed) if __name__ == '__main__': object_1=A() # 初始化B时就传入A实例 object_2=B(object_1) object_1.process1() object_1.process2() object_2.addition()
对应的Experiment_2代码调整为:
# Experiment_2 from Experiment_1 import A, B object_1=A() # 初始化B时传入当前模块的A实例 object_2=B(object_1) object_1.process1() object_1.process2() object_2.addition()
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

