Python MRO问题咨询:为何一段代码抛出TypeError另一段正常?
为什么两段代码一个报错一个正常?
先简单说下Python的MRO(方法解析顺序):就是调用类的方法时,Python查找这个方法的先后顺序。这个顺序必须完全一致、没有矛盾,不然就会报错。
第一段代码报错的原因
先理清楚类的继承关系:
C继承A和B,所以C的方法查找顺序是:C → A → B → object(Python3新式类用C3算法生成顺序,核心规则是父类的继承顺序不能被打乱)D继承B和C,这时候Python要生成D的MRO,必须满足两个硬性要求:- 遵循
D自己的继承声明顺序:B必须排在C前面 - 遵循父类
C的MRO顺序:A必须排在B前面
这两个要求直接冲突——既要B在C前面,又得A在B前面,但C的顺序里A本来就在B前面,同时D要求B在C前面,根本凑不出一个不矛盾的查找顺序,所以Python抛出TypeError,提示无法生成一致的方法解析顺序。
- 遵循
第二段代码正常运行的原因
这段里D继承的是C和B,生成MRO时的要求:
- 遵循
D的继承声明顺序:C必须排在B前面 - 遵循父类
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
相关产品推荐
相关产品推荐

