技术咨询:super关键字指向的类是什么?多继承场景下如何判定?
嘿,这个问题问到点子上了,我来给你掰扯清楚super关键字的那些事儿~
1.
super关键字指向的是哪个类? 简单来说,super()的指向不是固定的某个类,它是根据当前类的**方法解析顺序(MRO,Method Resolution Order)**来确定下一个要调用的类的。
在最常见的单继承场景里,MRO是线性的,所以super()看起来就是指向子类直接继承的父类。比如:
class Parent: def say_hi(self): print("Hi from Parent!") class Child(Parent): def say_hi(self): super().say_hi() # 这里super指向Parent类
但本质上,它是在MRO列表里找当前类的下一个类——单继承时MRO就是Child → Parent → object,所以下一个就是Parent。
2. 多继承场景下的
super行为 你的疑问里提到的“最先创建的类”是个误区,super的指向和类的创建顺序没关系,完全由当前类的MRO列表决定。
举个直观的例子:
class A: def func(self): print("From A") class B(A): def func(self): print("From B") super().func() class C(A): def func(self): print("From C") class D(B, C): def func(self): print("From D") super().func()
我们先看D的MRO列表:D → B → C → A → object。当你调用D().func()时:
- D里的
super().func()会调用B的func; - B里的
super().func()不会调用A,而是调用C的func(因为B在MRO里的下一个类是C,不是A!)
所以在多继承里,super()指向的是MRO列表中当前类的下一个类,它可能是当前子类的直接父类,也可能是另一个间接父类,完全由继承结构和C3算法计算出的MRO决定,和类创建的先后顺序无关。
内容的提问来源于stack exchange,提问作者zrobot
相关产品推荐
相关产品推荐

