Python类不在__init__定义属性时跨方法报AttributeError如何解决
实例属性self.DATOS、self._METH的赋值逻辑完全写在method_A方法内部,只有method_A被实际调用时,这两个属性才会绑定到类实例上。你当前的代码在实例化类A之后直接调用method_B,从未执行过method_A的赋值流程,实例上根本不存在DATOS属性,自然会抛出AttributeError异常。
__init__方法中预定义属性) 方案1:保证调用顺序,先执行
method_A完成属性绑定再调用method_B
这是最贴合你当前类设计逻辑的方案,如果你的业务本身就要求method_A作为类实例的初始化配置入口,直接调整调用顺序即可:x = A() # 先传入对应参数调用method_A,完成实例属性赋值 x.method_A(d="待存储的业务数据", m=对应的方法入参) # 之后调用method_B即可正常获取DATOS的值 result = x.method_B()注意:该方案无容错能力,后续代码如果漏调
method_A直接访问属性,还是会触发属性错误。方案2:在
method_B中增加属性存在校验,配置兜底返回值
不需要调整类的其他结构,只需要修改method_B的实现逻辑,访问属性前先判断属性是否已经被赋值:def method_B(self): # 属性存在则返回实际赋值,不存在则返回你指定的默认值(示例中为None,可按需替换) return self.DATOS if hasattr(self, 'DATOS') else None这种写法下,即使从未调用过
method_A,method_B也会返回默认值不会报错;一旦method_A被调用完成赋值,method_B就会正常返回你传入的d参数值。方案3:通过
__getattr__魔法方法实现属性访问兜底
如果类中类似DATOS的动态属性比较多,不想在每个属性访问的位置都重复写hasattr判断,可以在类中实现__getattr__方法:当代码访问一个不存在的实例属性时,Python会自动触发该方法的逻辑,你可以在这里给指定的动态属性配置默认返回值,全程不需要在__init__中提前定义属性:class A: def __init__(self) ->None: pass def method_A(self,d,m): self.DATOS = d self._METH = m def method_B(self): return self.DATOS def __getattr__(self, attr_name): # 给method_A中赋值的两个动态属性配置默认返回值 if attr_name in ('DATOS', '_METH'): return None # 访问其他未定义的属性时,保持原有抛错逻辑 raise AttributeError(f"'A' object has no attribute '{attr_name}'")
内容的提问来源于stack exchange,提问作者myamulla_ciencia

