Python多继承中__init__无报错、display()报错的原因探究
问题解答
Python的object类是否包含__init__()?
是的,Python的object类自带__init__()方法,但它是一个空实现——方法内部没有任何逻辑,仅接收self参数,调用后不会产生任何副作用。
为什么代码一无报错而代码二报错?
结合方法解析顺序(MRO)来分析两者的执行逻辑:
代码一的执行流程
代码一中类C的MRO是[C, A, B, object]:
- 创建
C实例时,先执行C.__init__(),打印c后调用super().__init__(),此时super()指向类A; - 执行
A.__init__(),打印a后调用super().__init__(),此时super()指向类B; - 执行
B.__init__(),打印b后调用super().__init__(),此时super()指向object; - 调用
object.__init__(),由于该方法存在且是合法的空实现,流程正常结束,不会报错。
代码二的执行流程
代码二中类C的MRO同样是[C, A, B, object]:
- 调用
C.display(),打印c后调用super().display(),指向类A; - 执行
A.display(),打印a后调用super().display(),指向类B; - 执行
B.display(),打印b后调用super().display(),指向object; - 尝试调用
object.display(),但object类根本没有定义display()方法,因此直接抛出AttributeError。
本质区别就是:object类存在__init__()方法但不存在自定义的display()方法,这导致了两段代码的执行结果不同。
内容的提问来源于stack exchange,提问作者Sandeep Chetia
相关产品推荐
相关产品推荐

