返回顶部
首页 > 资讯 > 后端开发 > Python >python 面向对象之继承顺序
  • 449
分享到

python 面向对象之继承顺序

面向对象顺序python 2023-01-30 21:01:18 449人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

先来看一个经典类class A:     def __init__(self):         p

先来看一个经典类

class A:
    def __init__(self):
        print('A')
class B(A):
    def __init__(self):
        print('B')
class C(A):
    def __init__(self):
        print('C')
class D(B,C):
        pass

obj = D()

继承顺序如下图:

1.png

B如果有构造函数,就不会继承C的构造函数

找到第一个构造函数,就停下来,不再寻找了。


构造函数只会执行一次,先从本身找,找不到,就去上层寻找,顺序如下:

D->B->C->A

执行上面的代码,输出:B


为什么会输出B呢?往下看


将B的构造函数注释掉

class A:
    def __init__(self):
        print('A')
class B(A):
    pass
    # def __init__(self):
    #     print('B')
class C(A):
    def __init__(self):
        print('C')
class D(B,C):
        pass

obj = D()

执行输出:C


将C的构造函数注释掉

class A:
    def __init__(self):
        print('A')
class B(A):
    pass
    # def __init__(self):
    #     print('B')
class C(A):
    pass
    # def __init__(self):
    #     print('C')
class D(B,C):
        pass

obj = D()

执行输出:A


这是一个正常的寻找顺序


那么问题来了

B虽然没有构造函数,但是它继承了A,它应该从A中继续寻找构造函数才对啊

为什么去找C呢?


因为D找B的时候,B发现没有,虽然B可以从A中继承,A是更高层的,先不找它。

BC是属于同一层的(继承B,C),既然B没有,那么去找C了。

这种查询策略,叫做广度优先


先从横向策略(D->B->C->A) 查找,如果找不到了,再从上层找。


查找有很多策略

上面说到B没有,不应该就这么结束了,直接去找C了。应该从A中查找,A如果没有,再找C,顺序如下:

D->B->A->C

这种查询策略,叫做深度优先

这里没有所谓的对错,是2种查询策略,也叫继承策略

在不同的场景下,会选择不同的查询策略

从上面的例子可以看出,是属于广度优先

python3开始,都是广度优先

使用python2执行如下代码:

class A():
    def __init__(self):
        print('A')
class B(A):
    pass
    # def __init__(self):
    #     print('B')
class C(A):
    def __init__(self):
        print('C')
class D(B,C):
        pass

obj = D()

执行输出:A

可以看出,Python2使用的是 深度优先


上面的代码是经典类写法

下面看一下新式类的写法

只是将A()改为A(object)

class A(object):
    def __init__(self):
        print('A')
class B(A):
    pass
    # def __init__(self):
    #     print('B')
class C(A):
    def __init__(self):
        print('C')
class D(B,C):
        pass

obj = D()

使用python3和python2执行

结果都是C


总结:


python2 经典类是按深度优先来继承的,新式类是按广度优先来继承的

python3 经典类和新式类都是统一按广度优先来继承的


在python2中,继承效率来讲,深度优先不如广度优先

所以在python3中,统一改成广度优先


--结束END--

本文标题: python 面向对象之继承顺序

本文链接: https://lsjlt.com/news/179034.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python 面向对象之继承顺序
    先来看一个经典类class A:     def __init__(self):         p...
    99+
    2023-01-30
    面向对象 顺序 python
  • python 面向对象之继承
    文章目录 前言继承的概念单继承多继承子类重写父类的同名方法和属性子类调用父类同名的方法和属性多层继承私有权限 前言 前面我们已经学习了 python 面向对象的类和对象,那么今天我将为大...
    99+
    2023-09-01
    python 开发语言
  • Python面向对象——继承
    #coding:utf-8 """ 术语: 1、在python3中,自定义创建的类都默认继承了python类中名为object的类 2、object类提供的方法,是双下划线开头的,是为了提供给python内部使用 3、被继承的类叫做超类,...
    99+
    2023-01-31
    面向对象 Python
  • python 面向对象之类的继承
    python中什么是继承:新类不必从头编写新类从现有的类继承,就自动拥有了现有类的所有功能新类只需要编写现有类缺少的新功能继承的好处:复用已有代码自动拥有了现有类的所有功能只需要编写缺少的新功能继承的特点:子类和父类是is关系python继...
    99+
    2023-01-30
    面向对象 python
  • python面向对象之类的继承详解
    目录一、概述 二、类的继承2.1 继承的定义2.2 构造函数的继承 2.3 子类对父类方法的重写三、类继承的事例一、概述  面向对象编程 (OOP) 语言的一个主要功能就是“继承”。...
    99+
    2024-04-02
  • python 面向对象之继承实例讲解
    面向对象编程语言具有封装、继承、多态三个基本特征,本文就继承举例详谈比如说学校主要有3大角色:学校,讲师,学员学校可以注册学员,统计有多少学员老师负责讲课学生听课,提问,学习,交学费先定义4个类:class School(obje...
    99+
    2023-01-30
    面向对象 实例 python
  • Python面向对象编程之类的继承
    目录1、对继承的理解2、类继承的构建3、Python中最基础的类4、ython类的重载4.1 属性重载4.2 方法重载5、类的多继承1、对继承的理解 继承(Inheritance) ...
    99+
    2024-04-02
  • Java全面分析面向对象之继承
    目录继承什么是继承呢?子类访问父类的成员变量子类访问父类非同名成员变量子类访问父类同名成员变量子类访问父类的成员方法子类访问父类的非同名方法子类访问父类的同名方法super关键字su...
    99+
    2024-04-02
  • 详析Python面向对象中的继承
    目录一单继承1.继承的基本语法格式如下2.查看类继承情况3.继承中的属性和方法4.初始化函数__init__()和super二多层继承三多重继承一 单继承 类继承作为python的三...
    99+
    2024-04-02
  • Java面向对象之类的继承介绍
    目录继承的作用如果没有继承机制是怎么样的?使用继承机制后的示例?类的继承是什么?子类和父类的继承机制Java单继承Java继承的顶级父类:Object对象的类型转换对象向上转型对象向...
    99+
    2024-04-02
  • 【JavaSE】面向对象编程思想之继承
     【本节目标】 继承 组合 目录 1. 为什么需要继承 2. 继承概念 3. 继承的语法 4. 父类成员访问 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. 子类构造方法 7....
    99+
    2023-09-03
    java 开发语言 学习方法
  • Python 面向对象编程的三大特性之继承
    目录Python  面向对象编程的三大特性之继承一、继承1、继承的实际栗子2、继承的好处3、继承的使用场景4、继承有几种?5、Python 中继承的简单语法二、不使用继承、...
    99+
    2024-04-02
  • Python基础面向对象之继承与派生详解
    目录一、面向对象三大特征之继承1、继承的概念2、继承的本质3、继承的实操4、继承后名字查找的顺序5、经典类与新式类二、派生1、派生的概念2、派生的方法一、面向对象三大特征之继承 py...
    99+
    2024-04-02
  • Java面向对象之继承的概念详解
    目录1. 继承1.1 继承的实现1.2 继承的好处和弊端1.3. Java中继承的特点2. 继承中的成员访问特点2.1 继承中变量的访问特点2.2 super2.3 方法重写2.4 ...
    99+
    2023-05-18
    Java 继承 Java 面向对象
  • JAVA面向对象之继承 super入门解析
    目录1 继承1.1概念1.2 特点1.3 练习:继承入门案例2 super3 继承的用法3.1 练习:super之继承中成员变量使用3.2 练习:super之继承中构造方法的使用4 ...
    99+
    2024-04-02
  • 【Java基础篇 | 面向对象】—— 继承
    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习Java...
    99+
    2023-10-11
    java 开发语言 面向对象
  • 面向对象封装、继承、多态
    一、面向对象封装   01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象,然后 让对象调用方法 对象方法的细节 都被 封装...
    99+
    2023-01-31
    面向对象 多态
  • JavaScript面向对象之class继承类案例讲解
    1. 面向对象class继承 在上面的章节中我们看到了JavaScript的对象模型是基于原型实现的,特点是简单,缺点是理解起来比传统的类-实例模型要困难,最大的缺点是继承的实现需要...
    99+
    2024-04-02
  • JavaScript面向对象中继承的概念
    本篇内容介绍了“JavaScript面向对象中继承的概念”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、...
    99+
    2024-04-02
  • JAVA面向对象中如何继承super
    小编今天带大家了解JAVA面向对象中如何继承super,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“JAVA面向对象中如何继承sup...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作