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
相关产品推荐
相关产品推荐

