day24 03 多继承

正常的代码中  单继承==减少了代码的重复

继承表达的是一种 子类是父类的关系

1、简单的多继承关系

A,B,C,D四个类,其中D类继承A,B,C三个父类,因此也叫多继承,子类方法调用的时候先找自己里面的,没有再根据就近原则逐个找父类里面的,最后没有还是会报错

class A:
def func(self):
print('A')
class B:
def func(self):
print('B')
class C:
def func(self):
print('C')
class D(A,B,C): # D继承A,B,C三个类,所以叫多继承
def func(self):
print('D')
d = D()
d.func() # 首先找自己里面是否有func方法,有就用自己的,没有才找父类,并且找的时候的顺序:A,B,C---就近原则

由于D类自己里面就有func方法,所以直接用自己的,所以运行结果:

D

这样简单的多继承问题,遵循的原则是:就近原则,按照D>A>B>C的顺序找

2、钻石继承问题

钻石继承关系:有四个类A,B,C,D,其中B,C都继承A,然后D继承B和C

class A:
def func(self):print('A') # (4)如果A里面还是找不到func函数,则会报错
class B(A):
def func(self):print('B') # (2)如果B里面也没有func函数,才会找到C里面的
class C(A):
def func(self):print('C') # (3)如果C里面还是找不到func函数,则最后才会找到A的
class D(B,C):
def func(self):print('D') # (1)首先先找自己本身的,如果这里没有func函数,就会根据就近原则找到B的
d = D()
d.func() # 首先找自己里面是否有func方法,有就用自己的,没有才找父类

砖石继承问题,遵循的一般规则:

自身优先;随后就近原则(广度优先),从左往右;最后到深度,竖直写的

因为本来就知道了B和C都可以最后找到A,所以才会先D>B>C>A,如果是按照D>B>A的顺序,则不会再去找C里面的了,这样如果A里面没有,

但是C里面有需要调用的方法,就会找不到最后报错

3、漏斗形继承问题

漏斗形继承关系:有五个类:A,B,C,D,E,其中D继承B和C,B继承A,C继承E

class A:
def func(self):print('A') # (3)如果A里面还是找不到func函数,才会找到C
class E:
def func(self): print('E') # (5)如果E里面还是没有,则会报错
class B(A):
def func(self):print('B') # (2)如果B里面也没有func函数,就会找到A里面的
class C(E):
def func(self):print('C') # (4)如果C里面还是找不到func函数,则最后才会找到E的
class D(B,C):
def func(self):print('D') # (1)首先先找自己本身的,如果这里没有func函数,就会根据就近原则找到B的
d = D()
d.func() # 首先找自己里面是否有func方法,有就用自己的,没有才找父类

漏斗形继承问题,遵循的一般规则:

自身优先;然后就近原则,广度优先,但是由于B和C继承的是不同的父类,所以先按D>B>A的顺序;

如果在A里面还是找不到相关的方法,才会找到C>E,最后E里面没有就会报错

如果在B里面没有找到的时候就去找C里面,则会错过了A,如果最后在E里面没有找到调用的方法,但是在A里面就有,这样就会找不到并且报错了

4、乌龟形继承问题

乌龟形继承关系:有A,B,C,D,E,F六个类,其中D继承B和C,B继承A,A继承F,C继承E,E继承F

class F:
def func(self):print('F') # (6)如果F里面还是找不到func函数,才会找到C
class E(F):
def func(self): print('E') # (5)如果E里面还是没有,则最后会找到F里面的如果还是找不到则会报错
class A(F):
def func(self): print('A') # (3)如果A里面还是找不到func函数,才会找到C
class B(A):
def func(self):print('B') # (2)如果B里面也没有func函数,就会找到A里面的
class C(E):
def func(self):print('C') # (4)如果C里面还是找不到func函数,则会找到E的
class D(B,C):
def func(self):print('D') # (1)首先先找自己本身的,如果这里没有func函数,就会根据就近原则找到B的
d = D()
d.func() # 首先找自己里面是否有func方法,有就用自己的,没有才找父类

乌龟形继承问题,一般遵循的原则:

自身优先,找不到找父类;根据广度优先即就近原则先找B的,如果B里面没有则会找A的,而不是找C的,这里和前面的漏斗形问题一样的道理;

如果A里面也找不到则会找到C,而不是F里面的,这里和前面的砖石形问题一样的道理,因为A和E都会找到F;

如果在A没有找到的情况下,就会接着按照C>E>F的顺序找

5、mro()函数

执行以下代码,最后print(D.mro()),可以找到继承的顺序

class F:
def func(self):print('F') # (6)如果F里面还是找不到func函数,才会找到C
class E(F):
def func(self): print('E') # (5)如果E里面还是没有,则最后会找到F里面的如果还是找不到则会报错
class A(F):
def func(self): print('A') # (3)如果A里面还是找不到func函数,才会找到C
class B(A):
def func(self):print('B') # (2)如果B里面也没有func函数,就会找到A里面的
class C(E):
def func(self):print('C') # (4)如果C里面还是找不到func函数,则会找到E的
class D(B,C):
def func(self):print('D') # (1)首先先找自己本身的,如果这里没有func函数,就会根据就近原则找到B的
d = D()
d.func() # 首先找自己里面是否有func方法,有就用自己的,没有才找父类
print(D.mro())

运行结果:

D
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class '__main__.E'>, <class '__main__.F'>, <class 'object'>]

6、总结

新式类(继承object类的才是新式类)继承原则:广度优先(就近原则)

经典类(如果直接创建一个类在2.7中就是经典类)继承原则:深度优先,一条线从下往上找,走到底,然后再换另一条线,走过的路就不会再走

多继承,子类的调用方法,默认就近原则

经典类中,深度优先

新式类中,广度优先

python2.7中新式类和经典类共存,新式类要继承object

python3中只有新式类,默认继承object

day24 03 多继承的更多相关文章

  1. day24 02 单继承(派生)

    day24 02 单继承(派生) 1.首先来看一个简单的例子 比如: 狗类的属性有:吃,喝,看门 鸟类的属性有:吃,喝,下蛋 看门和下蛋就是这两种动物不同的属性,而吃喝是两个共同的属性 以下代码实现了 ...

  2. day24 01 初识继承

    day24 01 初识继承 面向对象的三大特性:继承,多态,封装 一.继承的概念 继承:是一种创建新类的方式,新建的类可以继承一个或者多个父类,父类又可称基类或超类,新建的类称为派生类或者子类 cla ...

  3. [03] Servlet继承关系和生命周期

    1.Servlet的继承关系 假如现有我们自定义的一个Servlet,继承HttpServlet,那么实际上它的继承链如下图:   可以看到,核心的部分在于: 两个顶级接口 Servlet Servl ...

  4. day24类的继承

    类的继承1 什么是继承    继承一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类\基类\超类    python中继承的特点:        1. 子类可以遗传/重用父类的属性   ...

  5. JavaSE 学习笔记03丨继承、接口、多态、内部类

    Chapter. 5 继承 继承作为面向对象的三大特征之一,它是多态的前提.它主要解决的问题是共性抽取. Java中的继承,是单继承.多级继承的. 已存在的类,被称为超类.基类.父类(parent c ...

  6. Java中的继承

    我们在以前的学习中,我们会了C#中的继承,今天我们来了解了解Java中的继承,其实都大同小异啦! 1.语法 修饰符 SubClass extends SuperClass(){ //类定义部分 } e ...

  7. 深入理解Java中的继承

    对于面向对象的程序设计而言,每一个程序员都应该去了解Java中的封装,继承和多态,那么我今天来说的主要是以继承为核心的主题. 一.关于对继承的理解. 继承是面向对象的三大特性之一,是java中实现代码 ...

  8. 编程从入门到提高,然后放弃再跑路(Java)

    1.Java入门篇 1.1 基础入门和面向对象 1.1.1 编程基础 [01] Java语言的基本认识 [02] 类和对象 [03] 类的结构和创建对象 [04] 包和访问权限修饰符 [05] 利用p ...

  9. 编程从入门到放弃(Java)

      1.Java入门篇 1.1 基础入门和面向对象 1.1.1 编程基础 [01] Java语言的基本认识 [02] 类和对象 [03] 类的结构和创建对象 [04] 包和访问权限修饰符 [05] 利 ...

随机推荐

  1. request在作用域中管理属性

    request在作用域中管理属性 制作人:全心全意 在作用域中管理属性 setAttribute(String name,Object object) name:表示变量名,为String类型,在转发 ...

  2. ubuntu14.04 fcitx安装

    先卸载ibus sudo apt-get remove ibus (也可尝试不卸载ibus,直接安装fcitx) 添加源 sudo add-apt-repository ppa:fcitx-team/ ...

  3. BZOJ 5028 小Z的加油店

    [题解] 本题要求求出区间内的各个元素通过加减之后能够得出的最小的数,那么根据裴蜀定理可知答案就是区间内各个元素的最大公约数. 那么本题题意化简成了维护一个序列,支持区间加上某个数以及查询区间元素的最 ...

  4. PAT 1125 Chain the Ropes

    Given some segments of rope, you are supposed to chain them into one rope. Each time you may only fo ...

  5. 关于git上传GitHub以及码云(gitee)

    如果你是gitee(码云),点击链接跳转 首先,你的有一个GitHub的账号(然后新建项目我就不说了) # Linux的方法 GitHub网站下的,点击settings下的emails,确认自己的邮箱 ...

  6. CF576D. Flights for Regular Customers

    n<=150个点,m<=150条路,每条路Ai,Bi,Di表示Ai到Bi有一条有向边,使用他前至少要走Di条路,问1到n最少走几条路. 又是n^4过150的题.... 不同于传统的最短路, ...

  7. Java发送带附件的QQ邮箱

    由于腾讯公司给QQ邮箱增加了一个授权码的密码保护,导致之前网上很多代码都不能用,于是就自己敲了一份demo. 注意在密码那里可能需要授权码,具体设置:http://service.mail.qq.co ...

  8. Javascript网址跳转方法

    第一种: window.location.href="http://www.baidu.com"; 第二种: window.navigate("http://www.ba ...

  9. 解决华为手机不出现logcat日志的问题

    问题描写叙述:公司一部华为手机在连接Eclipse时在Logcat中看不到相关日志 解决方法:1 进入手机拨号界面2 输入*#*#2846579#*#*3 输入完成后自己主动跳转到測试界面4 依次选择 ...

  10. OpenCV2马拉松第25圈——直线拟合与RANSAC算法

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/28118095 收入囊中 最小二乘法(least ...