You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:57:03