简介
Python 是一门面向对象的编程语言,其类继承机制为多继承。因此,一个类可以继承一个或多个父类。
super 好处
在 Python 中,使用 super 的好处有如下两条:
- 避免显示调用父类类名,提高代码可维护性(与大多数其他语言一致);
- 在多继承情况下,根据 C3 算法顺序找到正确的下一个父类(区别于静态语言或单继承语言);
例子展示
假设有如下几个类:
class A(object):
def __init__(self):
print('A')
class B(A):
def __init__(self):
print('B')
super().__init__()
class C(A):
def __init__(self):
print('C')
super().__init__()
class D(B,C):
def __init__(self):
print('D')
super().__init__()
if __name__ == '__main__':
d = D()
上面类输出的结果为:D B C A
分析:在 Python 中,对于我们自定义的每一个类,Python 会根据 C3 算法计算出一个方法解析顺序(Method Resolution Order, MRO)列表,它代表了类继承的顺序。类实例在遇到super
调用时,会依次调用其__mro__
上记录的类。
我们查看一下类D
的 MRO 列表:D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>
可以看到,D
的父类按顺序依次为:D
,B
,C
,A
,object
所以,当我们实例化D
时,程序执行的流程如下所示:
- 执行
d=D()
,进入D.__init__
构造函数,此时执行print('D')
输出 D,然后执行super().__init__()
,此时就会查询D.__mro__
列表找到下一个父类B
,然后走B
的构造函数; - 进入
B.__init__()
,执行print('B')
输出 B,然后又再次执行super().__init__()
,记住这里的super
不是类B
的父类,而是指代类D
调用super
,因此此时就会再次查询D.__mro__
列表,找到下一个父类,为C
,然后就会走C
的构造函数; - 类
C
的执行流程与B
一致,最后一直走到类A
的构造函数,执行输出 A 操作,完成整个流程;
总结
Python 中的super
关键字确切地说,指代的是类 MRO 列表顺序,不能严格认为指向父类。
网友评论