在面向对象的语言中,super这个词表示的一般都是“父”的意思。在python中更是常见一个子类的__init__方法中时不时来一个super()。Good,那是不是就可以单纯的将其理解为是当前该类型的父类呢?我只能告诉你:单一继承的时候是这样的,但是多继承的时候不是的。
当然,对于常使用的py的朋友来说,super一定是耳熟能详的方法,这里就不多赘述用法,只聊原理。
在py中 ,每个类型会有一个mro()方法,这是方法是利用C3线性化算法产生的继承顺序队列。所以说,每次调用super时,super会查找这个队列中下一个类型,然后调用下一个类型的方法。
用代码说明一下:
class root: def __init__(self): print("I'm root!") class childA(root): def __init__(self): print("I'm childA1") super().__init__() print("I'm childA2") class childB(root): def __init__(self): print("I'm childB1") super().__init__() print("I'm childB2") class grandchild(childA, childB): def __init__(self): print("I'm grandchild1") super().__init__() print("I'm grandchild2") print(grandchild.mro()) gc = grandchild()定义一组很简单的多重继承类型,打印个结果:
C:\Python36\python.exe C:/Code/test/test1/test_set.py
[<class '__main__.grandchild'>, <class '__main__.childA'>, <class '__main__.childB'>, <class '__main__.root'>, <class 'object'>]
I'm grandchild1
I'm childA1
I'm childB1
I'm root!
I'm childB2
I'm childA2
I'm grandchild2
这样,我们就可以很容易发现,所有的打印是按照mro表给出的顺序来执行的,这就是super的原理。我是隔壁小王,欢迎大家
与我探讨分享。