Python类__init__方法赋值实例属性后调用时值丢失问题
问题原因
核心错误是__init__方法里的分支逻辑写为if...elif...结构,两个分支是互斥执行的:只要condition1判定为真,就会直接进入第一个分支执行self.a赋值,后续elif condition2的分支会被直接跳过,完全不会执行self.b的赋值逻辑。哪怕两个条件同时为真,也只会执行第一个命中的if分支,这是Python分支判断的基础规则。
你断点观测到__init__执行末尾两个属性都存在,基本是观测偏差导致,常见场景:
- 断点绑定的观测对象不是当前触发报错的实例,是之前调试流程中手动给
self.b赋过值的旧实例残留 - 你贴出的是简化代码,实际
__init__里还有其他未贴出的self.b赋值逻辑,这部分逻辑在你复现问题的场景下没有触发
修复方法
- 如果需要两个条件同时满足时两个属性都完成赋值,把
elif改成独立的if语句即可,两个分支会独立判断、独立执行:
class A: def __init__(self): if condition1: self.a = some_variables if condition2: self.b = some_variables def method1(self): # 你的业务逻辑 return self.a, self.b
- 更稳妥的实践是在
__init__最开头为所有实例属性设置默认初始值,避免某个分支没走到时,后续方法访问属性直接抛出AttributeError:
class A: def __init__(self): # 提前初始化所有实例属性 self.a = None self.b = None if condition1: self.a = some_variables if condition2: self.b = some_variables def method1(self): # 你的业务逻辑 return self.a, self.b
内容的提问来源于stack exchange,提问作者Hoi Man Hyman LAI
相关产品推荐
相关产品推荐

