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

使用getattr跨类获取数据时触发AttributeError问题求助

问题原因与修复方案

错误原因

你在obj_2的r_data方法里执行getattr(obj_1, "get_id")(self)时,把obj_2的实例(self)传给了obj_1的get_id方法。但get_id方法里访问的self.var_1是obj_1实例的属性,obj_2实例根本没有这个属性,所以触发AttributeError。

同理,rd方法里的getattr(obj_1, 'vw')(self)也存在同样的逻辑错误——调用类的实例方法时,必须传入该类的实例,而不是其他类的实例。

修复方案

要实现obj_1向obj_2传递数据,你需要先创建obj_1的实例,再调用它的方法获取数据。以下是两种可行的修改方式:

方式1:在obj_2中创建obj_1实例并复用

class obj_1:
    def __init__(self):
        self.var_1 = 'Hello'
        self.var_2 = 'World'

    def get_id(self):
        i = self.var_1
        j = self.var_2       
        return i, j

    def vw(self):
        print('Hello..')

class obj_2:
    def __init__(self):
        # 初始化时创建obj_1实例,后续方法可复用
        self.obj1_instance = obj_1()

    def r_data(self):
        print('called r_data')
        # 调用obj_1实例的get_id方法,实例调用会自动绑定self,无需手动传入
        x, y = getattr(self.obj1_instance, "get_id")()
        print('x > ', x)
        print('y > ', y)

    def rd(self):
        # 调用obj_1实例的vw方法
        getattr(self.obj1_instance, 'vw')()

if __name__ == '__main__':
    ob = obj_2()
    ob.r_data()
    ob.rd()

方式2:在需要时临时创建obj_1实例

如果不需要复用obj_1实例,也可以在方法内部临时创建:

class obj_2:
    def __init__(self):
        pass

    def r_data(self):
        print('called r_data')
        obj1 = obj_1()
        x, y = getattr(obj1, "get_id")()
        print('x > ', x)
        print('y > ', y)

    def rd(self):
        obj1 = obj_1()
        getattr(obj1, 'vw')()

补充说明

如果你的场景中obj_1的方法不需要依赖实例属性,可以将其定义为类方法或静态方法,这样无需创建实例就能调用,但显然你的get_id需要访问var_1和var_2,所以必须基于实例调用。

内容的提问来源于stack exchange,提问作者sonny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:39:17