大家都知道 super是代表调用父类的方法,但是super真的是你想的调用父类的方法吗!
先看这段代码,想一下输出的结果
# *_*coding:utf-8 *_*
class A:
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__()
d = D()
结果应该是常规想的 顺序为 D B A C
下面解释一下我的想法
首先我们创建一个D的实例d,然后进入D的 __init__ 方法,打印出 D 这个是毋庸置疑的,然后 进入 super().__init__()
就是调用父类的方法,python是支持继承,所以按照顺序,应该是 进入 B的__init__方法,打印出B,然后再调用父类B的super方法,因为父类B继承了A,所以打印了A,然后再回来,调用C
实际上是错误的,我们的思路是 DFS的方法(不懂自己去百度)
这是之前版本的方法
具体参考MRO
我们现在运行下代码 打印一下 D B C A
震惊,为啥,因为这是python MRO的算法,大致根据 BFS(不懂自己去百度)来 也就是说 D先到B再到C,C再到A。
好了 现在我们注释B里面的 super().__init__
会发现打印了 D B
或者注释 C里面的 super().__init__
会发现打印了 D B C
想必我们一定发现了! 通俗的话讲就是 断了!这个‘图’ 断了
接下来我们在文末加上
print(D.__mro__)
打印出来
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
不用我多说了吧