You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中D类内调用C().__init__()为何构造输出重复打印两次?

问题原因

出现重复打印的核心问题出在D类__init__里写的C().__init__()这行代码,这行代码并没有实现“给当前D实例调用父类C的初始化方法”的效果,反而做了两步额外操作:

  • 第一步执行C():这行代码会单独创建一个和当前D实例完全无关的全新C类对象,创建对象的过程会自动触发C类的__init__方法,沿着C自身的继承链(C→F→M→object)依次执行初始化逻辑,打印出第一组C constructor、F constructor、M constructor日志。
  • 第二步执行.__init__():等C()执行完成、返回刚才创建好的C实例后,你又手动对这个已经初始化完成的C实例调用了一次__init__方法,相当于把这个C实例的初始化流程完整重跑了一遍,因此会再次打印第二组C、F、M的构造日志。
修复方案

Python类继承场景下,调用父类初始化方法时不要手动实例化父类。多继承场景推荐用super()按照类的MRO(方法解析顺序)链式调用父类方法,如果确实要显式指定调用某个父类的初始化方法,需要把当前类的实例self作为参数传入父类的__init__,参考写法:

class D(C,F):
    def __init__(self):
        print("D constructor")
        # 推荐写法:通过super按MRO顺序调用父类初始化
        super().__init__()
        # 如果要显式指定调用C类的初始化,用下面的写法,不要写C()
        # C.__init__(self)

修改后运行代码,输出就会和预期一致,仅打印一次C、F、M的构造日志。

内容的提问来源于stack exchange,提问作者arin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:42:58