[TOC] >[success] # 调用父类方法 ~~~ 1.讲解继承中的super() 函数 在py2 和py3的区别 2.py2 中使用需要super(当前子类,self).调用方法 例如super(FooChild,self).__init__() 3.py3 直接super.调用方法 4.super 继承的机制是Python会计算出一个所谓的方法解析顺序(MRO)列表,为了实现继承,Python会在MRO列表上从左到 右开始查找基类,直到找到第一个匹配这个属性的类为止。 5.子类会先于父类被检查,多个父类会根据它们在列表中的顺序被检查,如果对下一个类存在两个合法的选择,选择第一个父类 ~~~ >[danger] ##### 案例 -- 重写 ~~~ 1.当子类,继承父类,且没有使用super()情况下,子类就会吧父类的方法重写 ~~~ ~~~ class A: def spam(self): print('A.spam') class B(A): def spam(self): print('B.spam') b = B() b.spam() 打印结果: B.spam ~~~ >[danger] ##### 案例 -- super() 继承 ~~~ 1.可以先调用父类方法在执行子类的方法,或者翻过来 ~~~ ~~~ class A: def spam(self): print('A.spam') class B(A): def spam(self): print('B.spam') # 继承 super().spam() b = B() b.spam() ~~~ >[danger] ##### 不使用super() 继承不建议使用、 ~~~ 1.直接使用继承的父类调用方法,在多继承的时候就会出现调用多次的情况,然而直接使用super 就不会出现这种问题 ~~~ ~~~ class Base: def __init__(self): print('Base.__init__') class A(Base): def __init__(self): Base.__init__(self) print('A.__init__') class B(Base): def __init__(self): Base.__init__(self) print('B.__init__') class C(A,B): def __init__(self): A.__init__(self) B.__init__(self) print('C.__init__') ~~~ * 打印结果: ~~~ c = C() Base.__init__ A.__init__ Base.__init__ B.__init__ C.__init__ ~~~ >[danger] ##### 参看子类的执行顺序__mro__ ~~~ class Base: def __init__(self): print('Base.__init__') class A(Base): def __init__(self): super().__init__() print('A.__init__') class B(Base): def __init__(self): super().__init__() print('B.__init__') class C(A,B): def __init__(self): super().__init__() # Only one call to super() here print('C.__init__') print(C.__mro__) 打印结果: (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>) ~~~