class a1:
def p(self):
print("class a1!")
class a2:
def p(self):
print("class a2!")
class a(a1,a2):
def p(self):
print("class a!")
class b1:
def p(self):
print("class b1!")
class b2:
def p(self):
print("class b2!")
class b(b1,b2):
def p(self):
print("class b!")
class ab(a,b):
def p(self):
print("class ab")
x=ab()
x.p()#class ab
super(ab,x).p()#"ab"的第一个超类是:class a
super(a,x).p()#"a"的第一个超类是:class a1
super(a1,x).p()#"a1"没有超类,但a的第二个超类是:class a2
super(a2,x).p()#"a2"没有超类,并且a的超类都检索过了,但是"ab"有第二个超类是:#class b
super(b,x).p()#"b"的第一个超类是:class b1
super(b1,x).p()#"b1"没有超类,但b的第二个超类是:class b2
super(b2,x).p()#"b2"没有超类,并且b的超类都检索过了,而且"ab"的超类也都检索过了,于是出错了
super() 函数是用于调用父类(超类)的一个方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表
本列中这张表的顺序为:
ab ---->a---->a1---->a2---->b---->b1---->b2