一句话总结:super是一个类,通过super().xxx()调用父类的方法。若父类是继承自object,找到方法xxx()就结束;若不是,则先算MRO list再确定调用顺序。单继承
多继承(只讨论两重继承)
1. 单继承
class A(object): # 可省略object
def __init__(self): # 找到__init__方法后,传递self参数,并打印里面的内容
print('class A')
class B(A):
def __init__(self):# 构造函数
print('class B')
super().__init__() # 通过super类调用父类A的__init__函数
# 以下是 python2.x 的写法,注意这里self是子类的实例
# super(B, self).__init__()
obj1 = B()
解析:class B(子类)继承了class A(父类)的方法,通过super方法拟调用父类class A的构造函数_init_(),因此代码输出结果如下:
class B
class A
2. 多继承(只讨论两重继承)
class A(object):
def __init__(self):
print('class A')
class B(object):
def __init__(self):
print('class B')
class C(A, B):
def __init__(self):
print('class C')
super().__init__() # MRO list为[C A B O],详见参考文献[2]
obj1 = C()
解析:class C(子类)继承了class A和class B(父类)的方法,通过super方法找父类中的_init_()方法,先找class A,如果找到了就结束;如果未找到就找class B是否存在_init_()方法,若都未找到则报错。因此代码输出结果如下:
class C
class A
如果class A跟class B的继承不是来自object呢?
class A(object):
def __init__(self):
print('class A')
class B(A):
def __init__(self):
print('class B')
super().__init__()
class C(A):
def __init__(self):
print('class C')
super().__init__()
class D(B, C):
def __init__(self):
print('class D')
super().__init__() # MRO list为[D B C A O],详见参考文献[2]
obj1 = D()
解析:上述例子虽然为两重继承,但是class B与class C的父类是class A。这里不调用两次class A的原因是:按照MRO的顺序是先调用class B再调用class C再调用class A的。因此代码输出结果如下:
class D
class B
class C
class A
如果你问我怎么求MRO list,可以看参考文献[2]~
参考文献与备注:
[3] MRO: Method Resolution Order