使用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
相关产品推荐
相关产品推荐

