类的多继承
八股文如下
多继承
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算法