Python子类中super().__init__()调用顺序与属性初始化问题
为什么调换
super().__init__()与self.cond初始化顺序会抛出AttributeError? 异常触发的核心原因
- 当你在子类
MaquinaCha的构造方法中先调用super().__init__()时,父类MaquinaBebida的__init__方法会立即执行,而父类__init__里调用了self.adicionarComplemento()。 - 由于Python的多态特性,此时
self是MaquinaCha的实例对象,因此实际执行的是子类MaquinaCha重写后的adicionarComplemento方法。 - 但此时
self.cond还未被赋值(赋值语句self.cond = cond在super().__init__()之后),所以子类方法中访问self.cond会直接抛出AttributeError: 'MaquinaCha' object has no attribute 'cond'。
为什么super().__init__()之后的语句不执行?
Python中,异常会直接中断当前代码的执行流程。当super().__init__()内部调用方法触发异常后,程序会立即退出当前的__init__构造方法,后续的self.cond = cond以及其他语句自然不会被执行。
正确顺序能运行的原因
在可正常运行的代码中,你先初始化了self.cond,再调用super().__init__()。此时父类__init__调用adicionarComplemento时,self.cond已经存在,子类方法可以正常访问该属性,不会触发异常,后续流程也能顺利完成。
内容的提问来源于stack exchange,提问作者Fernando Andrade
相关产品推荐
相关产品推荐

