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

Python MRO问题咨询:为何一段代码抛出TypeError另一段正常?

为什么两段代码一个报错一个正常?

先简单说下Python的MRO(方法解析顺序):就是调用类的方法时,Python查找这个方法的先后顺序。这个顺序必须完全一致、没有矛盾,不然就会报错。

第一段代码报错的原因

先理清楚类的继承关系:

  • C 继承 A 和 B,所以C的方法查找顺序是:C → A → B → object(Python3新式类用C3算法生成顺序,核心规则是父类的继承顺序不能被打乱)
  • D 继承 B 和 C,这时候Python要生成D的MRO,必须满足两个硬性要求:
    1. 遵循D自己的继承声明顺序:B必须排在C前面
    2. 遵循父类C的MRO顺序:A必须排在B前面
      这两个要求直接冲突——既要B在C前面,又得A在B前面,但C的顺序里A本来就在B前面,同时D要求B在C前面,根本凑不出一个不矛盾的查找顺序,所以Python抛出TypeError,提示无法生成一致的方法解析顺序。

第二段代码正常运行的原因

这段里D继承的是C和B,生成MRO时的要求:

  1. 遵循D的继承声明顺序:C必须排在B前面
  2. 遵循父类C的MRO顺序:C → A → B → object
    把这两个要求结合起来,D的MRO就是:D → C → A → B → object。这个顺序既满足D自己的继承要求(C在B前),又没打破C的查找顺序(C之后是A,再是B),完全一致无矛盾,所以Python能正常生成MRO。
    当调用d.method()时,按这个顺序查找:D没有method,找C也没有,再找A,找到A.method(),最终输出A.method() called。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:05:23