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

Python中调用super()时基类方法的影响及多继承调用疑问

Python类继承与super()的常见问题解答

1. 为什么Employee的getLanguage方法会被调用?

Python里的super()并非直接调用当前类的父类方法,而是根据调用方法的实例的方法解析顺序(MRO),找到当前类在MRO链中的下一个类,调用对应方法。

你的代码中,Programmer2的继承关系是Programmer2(Programmer, Employee),它的MRO顺序为:Programmer2 → Programmer → Employee → object。当执行p2.getLanguage()时:

  • 先触发Programmer2的getLanguage,其中的super().getLanguage()会按照MRO找到Programmer2的下一个类Programmer,调用其getLanguage方法;
  • 接着Programmer的getLanguage里的super().getLanguage(),此时基于p2的MRO链,Programmer的下一个类是Employee,于是调用了Employee的getLanguage方法。

这就是为什么Employee的方法会被执行——super()的行为依赖于实例的MRO,而非定义super()的类的直接父类。

2. 为什么所有输出的language都是C++?

在Python中,self始终指向调用方法的实例。这里调用方法的实例是p2 = Programmer2(),它的language属性被定义为"C++"。不管是在Employee、Programmer还是Programmer2的方法里,self.language访问的都是这个实例的language属性,而非所在类的类属性。

虽然每个类都定义了自己的language类属性,但实例p2的language属性会覆盖所有父类的类属性,因此所有输出的language都是C++。

代码示例

class Employee:
    company= "Google"
    language = "java"
    def showDetails(self):
        print("This is an employee")

    def getLanguage(self):
        print(f"1. The language is {self.language}")


class Programmer:
    language= "Python"
    company = "Youtubeeee"
    def getLanguage(self):
        super().getLanguage()
        print(f"2. The language is {self.language}")

    def showDetails(self):
        print("This is a programmer")


class Programmer2(Programmer , Employee):
    language= "C++"
    def getLanguage(self):
        super().getLanguage()
        print(f"3. The language is {self.language}")


p2 = Programmer2()
p2.getLanguage()

输出结果

1. The language is C++
2. The language is C++
3. The language is C++

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:35:21