菱形继承
R
M S
N
继承的关系:N -> M -> S -> R,即__mro__列表中类的顺序
定义类后,程序会自动生成一个体现继承关系的列表,mro(Method Relation Order)方法关系列表
mro列表排序原则:
1.子类永远在父类前面
2.同一等级的类,按照子类的继承顺序排列
mro保证了多继承情况下每个类只出现一次
super().__init__ 与 ClassName.__init__() 在单继承中用法几乎一致
多继承中,super()能保证每个父类的方法只执行一次,但使用ClassName的方式会导致父类方法被多次执行
多继承时,使用 ClassName.__init__() 要把每个父类都重写一遍,使用 super() 则只需这一句命令
多继承时,使用 super() 对父类传参必须把参数全部传递
class R(object):
n = 'XR'
def fcb(self):
print(self.n,self)
print('牛尾巴','R')
class M(R):
n = 10
def fcb(self):
super().fcb()
print(super().n)
print('沉肩','M')
class S(R):
n = 9
def fcb(self):
super().fcb()
print(super().n)
print('油炸丸子','S')
class N(M,S):
n = 11
def fcb(self):
super().fcb()
print(super().n)
print('彩虹','N')
n = N()
n.fcb()
res = N.__mro__
print(res)
# issubclass
res1 = issubclass(M,S)
res2 = issubclass(S,M)
res3 = issubclass(N,R)
print(res1,res2,res3)
11 <__main__.N object at 0x000000CCBA606D08>
牛尾巴 R
XR
油炸丸子 S
9
沉肩 M
10
彩虹 N
(<class '__main__.N'>, <class '__main__.M'>, <class '__main__.S'>, <class '__main__.R'>, <class 'object'>)
False False True