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

2021/12/14 6:18:55

本文主要是介绍七、面向对象 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


这篇关于七、面向对象 12.菱形继承的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程