Python的super()原理

 在面向对象的语言中,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的原理。我是隔壁小王,欢迎大家

与我探讨分享。






猜你喜欢

转载自blog.csdn.net/BmwGaara/article/details/79216825
今日推荐