super与继承关系

super函数是一个很好的改写父类的方法,前几天刚好接触到了这个函数,就研究了一下。

用法

super() 函数是用于调用父类(超类)的一个方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。

super的语法比较简单:super(type[, object-or-type]),参数 type -- 类 object-or-type -- 类,一般是 self 。
Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :
实例:

class A:
    def __init__(self):
        print('A')
class B(A):
    def __init__(self):
        super().__init__()#假设要是python2就应当写super(B,self).__init__
        print('B')
b=B()

它的本意就是对父类的方法进行拓展,不必直接到父类的代码进行修改。

一些拓展

单纯的讨论super函数其实没有问题,但是一旦涉及到多重继承,就涉及到python中的继承问题

深度优先与广度优先

首先无论是深度优先还是广度优先,在调用时会率先调用最近的类。例如class B(A,C,D)就会先调用A,再调用C,最后是D。
python3中优先采用的继承顺序是广度优先,在查询时率先把本层的全部查询完才进入下一层


图一

图二

例如上面两个图,图一的调用顺序就是A>B>C>D>E,图二就是A>B>C>D
而在python2中,默认经典类,采用的是深度优先的算法。查询时,先走一条路走到最深层次,才走另一条路。对应到上图就是A>B>D>C>E,A>B>D>C。

你可能感兴趣的:(super与继承关系)