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. 08 Python基础数据结构

    目录: 1) 列表 2) 元组 3) 字符串 4) bytes 5) bytearray 6) 字典 7) 集合 8) 冻集合 """1. 列表特性2. 创建3. 增加4 ...

  2. 天猫双11红包前端jQuery

    [01]   浏览器支持:IE10+和其他现代浏览器.   效果图:       步骤:   HTML部分:   <div class="opacity" style=&qu ...

  3. https://gitee.com/tomsun28/bootshiro-------需要研究的项目

    https://gitee.com/tomsun28/bootshiro-------需要研究的项目

  4. java 日历计算农历和节假日的工具类

    背景 业务需求需要后端提供这样的接口,网上找了很多java代码例子,虽然功能实现了 但是不完善,特别是节日那一块儿.然后百度发现有这样的插件,但是信息也是java后端提供的非js 然后在开源js插件找 ...

  5. mongodb local数据库的空间初始化好大啊!

    新建立了一个replicat set,登录到primary里,show dbs一看吓一跳 local数据库竟然占用了80多G的空间 [root@wxlab31 bin]# ./mongo --host ...

  6. Jquery 实现表单提交按钮变灰,防止多次点击提交重复数据

    表单提交时候我们应该控制提交按钮,不能点击多次进行数据的重复提交.要不然就会有冗余的重复的数据在系统中,造成系统出现数据垃圾.jQuery很简单的就可以实现对表单提交按钮控制,下面就是相关的例子和代码 ...

  7. python中实现将普通字典dict转换为java中的treeMap

    上代码: from heapq import heappush,heappop from collections import OrderedDict def toTreeMap(paramMap): ...

  8. 项目中应用到的框架和技术之一——Materialize

    一群做C++的老伙计搞前端开发,徒手写html和css应该会折寿..在网上找了半天,Materialize算是用起来很方便的一款前端界面框架.Google的Material Design看起来感觉还是 ...

  9. Android 学习历程摘要(三)

    1.proguard混淆:对与Activity等不应进行混淆.否则系统将找不到生命周期函数:JSON字符串要考虑混淆之后是否会影响字段名:native方法也不混淆,否则调用不到 2.ListView的 ...

  10. Python基础--高速改造:字符串

    Python的字符串值得一说. 先看: >>>"Hello world!" 'Hello world!' 我们写是双引號,可是打印出来后是单引號. 差别何在? 答 ...