美文网首页
Python super 简解

Python super 简解

作者: Whyn | 来源:发表于2019-02-07 13:21 被阅读7次

简介

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时,程序执行的流程如下所示:

  1. 执行d=D(),进入D.__init__构造函数,此时执行print('D')输出 D,然后执行super().__init__(),此时就会查询D.__mro__列表找到下一个父类B,然后走B的构造函数;
  2. 进入B.__init__(),执行print('B')输出 B,然后又再次执行super().__init__(),记住这里的super不是类B的父类,而是指代类D调用super,因此此时就会再次查询D.__mro__列表,找到下一个父类,为C,然后就会走C的构造函数;
  3. C的执行流程与B一致,最后一直走到类A的构造函数,执行输出 A 操作,完成整个流程;

总结

Python 中的super关键字确切地说,指代的是类 MRO 列表顺序,不能严格认为指向父类。

参考

相关文章

网友评论

      本文标题:Python super 简解

      本文链接:https://www.haomeiwen.com/subject/egnwsqtx.html