面向对象编程:类的多继承(单纯多继承和多重多继承)

类的多继承

八股文如下

多继承
OCP原则:多用”继承“,少修改

继承的用途:增强基类,实现多态

多态

在面向对象中,父类、子类通过继承联系在一起,如果可以通过一套方法,就可以实现不同变现,就是多态
一个类继承自多个类就是多继承它将具有多个类的特征
多继承弊端
多继承很好的模拟了世界,因为事务很少单一继承,但是舍弃简单,必然引入复杂性,带来了冲突

如同一个孩子继承了来自父母双方的特征,那么到底眼睛像爸爸还是妈妈尼?孩子究竟改像谁多一点尼?

多继承的实现会导致编译器设计的复杂度增加,所以现在很多语言舍弃了类的多继承

C++支持多继承;Java舍弃了多继承

Java中,一个类可以实现多个接口,一个接口也可以继承多个接口。Java的接口很纯粹,只是方法声明,继承者必须实现这些方法,就具有了这些能力,就能干什么
多继承可能会带来二义性,例如,猫和狗都继承自动物类,现在一个类多继承了猫和狗类,猫和狗都有了shout方法,子类究竟继承谁的shout尼?

解决方案:实现了多继承的语言,要解决二义性,深度优先或者广度优先

多继承带来的路径选择问题,究竟继承那个父类的特征尼?

究竟先广度优先,还是深度优先
Python使用MRO(method resolution order) 解决类搜索顺序问题。

经典算法,按照定义从左到右,深度优先策略【比如Python2.2之前,左图的MRO算法,MyClass→D→B→A→C→A】
新式类算法,经典算法的升级,重复的只保留最后一个。【左图MRO是:MyClass→D→B→C→A→object】
C3算法,在类被创建出来的时候,就计算除一个MRO有序列表。【Python3唯一支持的算法,左图中MRO是MyClass→D→B→C→A→object】C3过于复杂,没必要去记,我们只要记住【object.mro(),显示继承的方法,从左到右依次查找】

多继承的缺点

当类很多,继承复杂的情况下,继承路径太多,很难说清什么样的继承路径

团队协作开发,如果引入多继承,那代码将不可控

不管编程语言是否支持多继承,都应当避免多继承

 这么多八股文,看了你也看不懂!还不如我直接上代码!!!

什么C3算法,你看了你也用不到,毕竟是工作,又不是搞科研!!

简单的多继承方式:

class Shengxian:
    def fly(self):
        print('神仙在飞!!')

class Monkey:
    def eat(self):
        print('猴子在吃桃子!')

class MonkeyKing(Shengxian,Monkey):
    def play_golden_stick(self):
        print('孙悟空在玩警棍!!')


m1=MonkeyKing()
m1.eat()
m1.fly()
m1.play_golden_stick()

问题1当多个父类中有两个相同方法时,子类调用时会调用哪个方法?

答:多继承一般按照从左到右的顺序进行继承!! ---当子类继承两个父类,同时两个父类有相同的方法时,不做任何修饰的情况下,子类调用方法时通常执行,先继承的父类

直接上代码:

'''
问题1:当多个父类中有两个相同方法时,子类调用时会调用哪个方法?

答:多继承一般按照从左到右的顺序进行继承!!
---当子类继承两个父类,同时两个父类有相同的方法时,不做任何修饰的情况下,子类调用方法时通常执行,先继承的父类

问题2:多重继承的情况下,当多个父类中有两个相同方法时,子类调用时会调用哪个方法?

答:有两种查找方法:①深度优先原则    ②广度优先原则
深度优先原则:  从左往右寻找,在从左边继承地方向上寻找

1、经典类
class A:
    pass
2、新式类:--加上object就变成了新式类,object其实就是一个基类,所有的类都要继承object类
class B(object):
    pass
注:
python2 中,经典类采用的是深度优先查找法,新式类采用的是广度优先

puthon3 中,无论是经典类,还是新式类,都是按广度优先查找

python 2.x 默认都是经典类,只有显示继承了object才是新式类

puyhon 3.x 默认都是显示类 都是广度优先(不纯粹的广度优先!!)---C3算法
'''

class Shengxian:
    def fly(self):
        print('神仙在飞!!')
    def fight(self):
        print('神仙在打架!!')

class Monkey:
    def eat(self):
        print('猴子在吃桃子!')
    def fight(self):
        print('猴子在打架!!')

class MonkeyKing(Shengxian,Monkey):
    def play_golden_stick(self):
        print('孙悟空在玩警棍!!')


m1=MonkeyKing()
m1.eat()
m1.fly()
m1.play_golden_stick()
m1.fight()

问题2:多重继承的情况下,当多个父类中有两个相同方法时,子类调用时会调用哪个方法?

答:有两种查找方法:①深度优先原则    ②广度优先原则
深度优先原则:  从左往右寻找,在从左边继承地方向上寻找

多说无益,直接上代码!!!

'''
问题1:当多个父类中有两个相同方法时,子类调用时会调用哪个方法?

答:多继承一般按照从左到右的顺序进行继承!!
---当子类继承两个父类,同时两个父类有相同的方法时,不做任何修饰的情况下,子类调用方法时通常执行,先继承的父类

问题2:多重继承的情况下,当多个父类中有两个相同方法时,子类调用时会调用哪个方法?

答:有两种查找方法:①深度优先原则    ②广度优先原则
深度优先原则:  从左往右寻找,在从左边继承地方向上寻找

1、经典类
class A:
    pass
2、新式类:--加上object就变成了新式类,object其实就是一个基类,所有的类都要继承object类
class B(object):
    pass
注:
python2 中,经典类采用的是深度优先查找法,新式类采用的是广度优先

puthon3 中,无论是经典类,还是新式类,都是按广度优先查找

python 2.x 默认都是经典类,只有显示继承了object才是新式类

puyhon 3.x 默认都是显示类 都是广度优先(不纯粹的广度优先!!)---C3算法
'''

class ShengxianBase:
    def fight(self):
        print('神仙始祖在打架!!')

class MonkeyBase:
    def fight(self):
        print('猿猴在打架!!')

class Shengxian(ShengxianBase):
    def fly(self):
        print('神仙在飞!!')
    def fight(self):
        print('神仙在打架!!')

class Monkey(MonkeyBase):
    def eat(self):
        print('猴子在吃桃子!')
    def fight(self):
        print('猴子在打架!!')

class MonkeyKing(Shengxian,Monkey):
    def play_golden_stick(self):
        print('孙悟空在玩警棍!!')


m1=MonkeyKing()
m1.eat()
m1.fly()
m1.play_golden_stick()
m1.fight()

注:

1、经典类
class A:
    pass
2、新式类:--加上object就变成了新式类,object其实就是一个基类,所有的类都要继承object类
class B(object):
    pass
注:
python2 中,经典类采用的是深度优先查找法,新式类采用的是广度优先

puthon3 中,无论是经典类,还是新式类,都是按广度优先查找

python 2.x 默认都是经典类,只有显示继承了object才是新式类

puyhon 3.x 默认都是显示类 都是广度优先(不纯粹的广度优先!!)---C3算法

猜你喜欢

转载自blog.csdn.net/qq_46044325/article/details/127015207