七、面向对象 12.菱形继承

菱形继承

  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
上一篇:MySQL设置数据库为只读


下一篇:java继承子父类构造函数-子类的实例化过程