我的编程空间,编程开发者的网络收藏夹
学习永远不晚

day24 03 多继承

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

day24 03 多继承

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 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

day24 03 多继承

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

day24 03 多继承

day24 03 多继承 正常的代码中  单继承==减少了代码的重复继承表达的是一种 子类是父类的关系 1、简单的多继承关系 A,B,C,D四个类,其中D类继承A,B,C三个父类,因此也叫多继承,子类方法调用的时候先找自己里面的,没有再根据
2023-01-31

day24 01 初识继承

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

python 继承与多重继承

当然,如果不支持python继承,语言特性就不值得称为“类”。派生类定义的语法如下所示: . . . 名称 BaseClassName 必须定义于包含派生类
2023-01-31

C++多继承(多重继承)的实现

多继承容易让代码逻辑复杂、思路混乱,本文主要介绍了C++多继承(多重继承)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-16

多重继承

继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能由于Python允许使用多重继承,因此,MixIn就是一种常见的设计只允许单一继承的语言(如Java)不能使用MixIn的设计通常的继承关系设计如下:  继承关系:Ani
2023-01-31

php是多继承还是单继承

php是单继承。php是不支持多继承的,但是php可以通过使用interface或者trait实现多继承,如【interface test1 {public function connect();}interface test2 ...】。
2016-11-13

继承和多态

在OOP程序设计中,当定义一个class的时候,可从某个现有的class继承新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)格式:  class 子类名(父
2023-01-31

多继承 , 组合 , 菱形继承 , 接口

一, 复习属性的的正确存放位置: 类中应该存储所有对象公共的内容 对象中存储都是每个对象独有的(都不同)初始化函数: 给对象的属性赋初值 , 可以保证只要对象被创建就一定有相应的属性 节省了重复代码绑定方法:
2023-01-31

python——多重继承

#方式一class A():    def __init__(self, name):        self.name = name        print("a class ...")class B():    def __init_
2023-01-31

Python类中的单继承和多继承用法

本篇内容主要讲解“Python类中的单继承和多继承用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python类中的单继承和多继承用法”吧!前言Python面向对象编程语言,有List、Str
2023-06-02

python中的多继承

python和C++一样,支持多继承。概念虽然容易,但是困难的工作是如果子类调用一个自身没有定义的属性,它是按照何种顺序去到父类寻找呢,尤其是众多父类中有多个都包含该同名属性。class P1 #(object):    def foo(s
2023-01-31

C++中单继承与多继承如何使用

今天小编给大家分享一下C++中单继承与多继承如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言C++的继承机制相对其
2023-06-30

怎么在python中定义单继承和多继承

本篇文章为大家展示了怎么在python中定义单继承和多继承,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python的数据类型有哪些?python的数据类型:1. 数字类型,包括int(整型)、lo
2023-06-14

python记录day_20 多继承

多继承继承: x是一种y的时候.可以使用继承关系。是"is a"的关系在python中,支持多继承,一个类可以拥有多个父类。但是多继承中, 存在着这样一个问题,当两个父类中出现了重名方法的时候该怎么办呢? 这时就涉及到如何查找父类方法的问题
2023-01-30

python怎么实现多继承

在Python中,实现多继承可以通过使用逗号分隔的多个父类来定义一个类。详细介绍:当一个类继承多个父类时,将继承所有父类的属性和方法。这意味着子类可以访问和使用父类中定义的属性和方法。本教程操作系统:windows10系统、Python3.
python怎么实现多继承
2023-12-11

php怎么实现多继承

这篇文章主要介绍“php怎么实现多继承”,在日常操作中,相信很多人在php怎么实现多继承问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php怎么实现多继承”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!1、
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录