广告
返回顶部
首页 > 资讯 > 后端开发 > Python >菱形继承问题
  • 836
分享到

菱形继承问题

菱形 2023-01-31 00:01:31 836人浏览 薄情痞子

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

摘要

目录 类的分类 新式类 经典类 菱形继承问题 C3算法与mro()方法介绍

目录

  • 类的分类
    • 新式类
    • 经典类
  • 菱形继承问题
  • C3算法与mro()方法介绍

新式类

  • 继承了object的类以及该类的子类,都是新式类

  • python3中所有的类都是新式类

经典类

  • 没有继承object的类以及该类的子类,都是经典类

  • 只有python2中才有经典类

92-菱形继承问题-继承关机.jpg

在Java和C#中子类只能继承一个父类,而Python中子类可以同时继承多个父类,如A(B,C,D)

如果继承关系为非菱形结构,则会按照先找B这一条分支,然后再找C这一条分支,最后找D这一条分支的顺序直到找到我们想要的属性

如果继承关系为菱形结构,即子类的父类最后继承了同一个类,那么属性的查找方式有两种:

  • 经典类下:深度优先
  • 广度优先:广度优先

  • 经典类:一条路走到黑,深度优先

92-菱形继承问题-经典类.png

  • 新式类:不找多各类最后继承的同一个类,直接去找下一个父类,广度优先

92-菱形继承问题-新式类.png

class G(object):
    # def test(self):
    #     print('from G')
    pass


print(G.__bases__)


class E(G):
    # def test(self):
    #     print('from E')
    pass


class B(E):
    # def test(self):
    #     print('from B')
    pass


class F(G):
    # def test(self):
    #     print('from F')
    pass


class C(F):
    # def test(self):
    #     print('from C')
    pass


class D(G):
    # def test(self):
    #     print('from D')
    pass


class A(B, C, D):
    def test(self):
        print('from A')


obj = A()
(<class 'object'>,)
obj.test()  # A->B->E-C-F-D->G-object
from A

92-菱形继承问题-飞船原理.jpg

python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,如:

print(A.mro())  # A.__mro__
[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.F'>, <class '__main__.D'>, <class '__main__.G'>, <class 'object'>]
for i in A.mro():
    print(i)
<class '__main__.A'>
<class '__main__.B'>
<class '__main__.E'>
<class '__main__.C'>
<class '__main__.F'>
<class '__main__.D'>
<class '__main__.G'>
<class 'object'>

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。

而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:

  1. 子类会先于父类被检查
  2. 多个父类会根据它们在列表中的顺序被检查
  3. 如果对下一个类存在两个合法的选择,选择第一个父类

--结束END--

本文标题: 菱形继承问题

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

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

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 菱形继承问题
    目录 类的分类 新式类 经典类 菱形继承问题 C3算法与mro()方法介绍 ...
    99+
    2023-01-31
    菱形
  • 多继承 , 组合 , 菱形继承 , 接口
    一, 复习 属性的的正确存放位置: 类中应该存储所有对象公共的内容 对象中存储都是每个对象独有的(都不同) 初始化函数: 给对象的属性赋初值 , 可以保证只要对象被创建就一定有相应的属性 节省了重复代码 ...
    99+
    2023-01-31
    组合 菱形 接口
  • 【C++历险记】面向对象|菱形继承及菱形虚拟继承
    个人主页:兜里有颗棉花糖💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【C++之路】💌 本专栏旨...
    99+
    2023-09-08
    c++ 面向对象
  • C++中的继承问题(继承基本概念、菱形虚拟继承的对象模型)
    目录一、继承的概念与定义格式概念及定义格式二、赋值兼容规则三、继承中的作用域四、子类的默认成员函数构造函数拷贝构造函数赋值运算符重载析构函数构造和析构函数调用顺序五、继承与友元、静态...
    99+
    2023-02-05
    C++的继承 继承基本概念 菱形虚拟继承
  • C++继承与菱形继承详细介绍
    目录继承的概念和定义基类和派生类之间的赋值继承中的作用域派生类的默认成员函数菱形继承继承和组合的区分与联系其余注意事项继承的概念和定义 继承机制是面向对象程序设计的一种实现代码复用的...
    99+
    2022-11-13
  • C++中菱形继承怎么处理
    本篇内容介绍了“C++中菱形继承怎么处理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!封装,继承,多态。这是C++语言的三大特性,而每次在谈...
    99+
    2023-06-29
  • 一文读懂C++中的继承之菱形继承(案例分析)
    目录前言一、什么是多继承?1.单继承2.多继承二、菱形继承1.虚基类的引入2.虚基表的引入总结前言 我们上一篇说了世间万物都有一个继承体制,或多或少子类继承了父类的某些特征,但大多都...
    99+
    2022-11-12
  • C++数据结构继承的概念与菱形继承及虚拟继承和组合
    目录继承的概念继承的定义基类和派生类对象之间的赋值转换继承中的作用域派生类的默认成员函数继承中的两个小细节继承和友元继承和静态成员单继承和多继承(菱形继承)虚拟继承概念虚拟继承的原理...
    99+
    2022-11-13
  • C++继承的赋值转换与菱形虚拟继承深入详解
    目录一、继承的概念及定义1.1、继承的概念1.2、继承的定义二、基类和派生类对象赋值转换三、继承中的作用域3.1、继承同名成员处理方式3.2、继承同名静态成员处理方式3.3、继承与友...
    99+
    2022-11-13
    C++继承的赋值转换 C++菱形虚拟继承
  • C++数据结构继承的概念与菱形继承及虚拟继承和组合分析
    这篇“C++数据结构继承的概念与菱形继承及虚拟继承和组合分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++数据结构继承...
    99+
    2023-06-29
  • C++中菱形继承的解释与处理详解
    封装,继承,多态。这是C++语言的三大特性,而每次在谈到继承时我们不可避免的要谈到一个很重要的问题——菱形继承。 派生类继承父类,同时也会继承父类中的所有成员...
    99+
    2022-11-13
  • 详解C++中菱形继承的原理与解决方法
    目录菱形继承形成原因应对方案虚继承 vitrual解决二义性变量内存布局–虚基表感悟菱形继承形成原因 多继承,呈菱形状 菱形继承代码: class A { publi...
    99+
    2023-02-01
    C++菱形继承原理 C++菱形继承解决方法 C++菱形继承
  • 聊聊spring继承的问题
    目录spring继承的问题为什么输出是0呢?spring注入有继承关系的类通过配置文件通过注解新建一个泛型类新建BaseRepository和BaseService的子类在Sprin...
    99+
    2022-11-12
  • 深入浅析python继承问题
    有如下的代码: class p1: def __init__(self,a,b): print("init in p1") self.a1=a self.b1=b self.f1() def f1(se...
    99+
    2022-06-04
    python
  • CSS继承问题实例分析
    本篇内容介绍了“CSS继承问题实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 根据 CSS目前的...
    99+
    2022-10-19
  • python3中多重继承的问题
    本来以为多重继承很简单,但是多看了一些资料后发现还是挺复杂的。 如果继承情况简单就还比较好理解,但是如果继承的情况太过于复杂的话,python3 中会使用拓扑排序的方式来寻找继承的父类。 有关继承的拓扑排序 关于这方...
    99+
    2023-01-31
  • python3--object类,继承与派生,super方法,钻石继承问题
    昨天内容复习组合:什么有什么的关系(例:老师有生日)class Birthday:     def __init__(self, year, month,&nb...
    99+
    2023-01-30
    钻石 方法 object
  • C++中多重继承问题详解
    C++中多重继承问题详解引言在C++中,多重继承是一种特性,允许一个派生类从多个基类中继承属性和行为。然而,由于多重继承引入了一些复杂性,开发人员必须小心处理,以避免潜在的问题。本文将详细讨论C++中多重继承的问题,并提供具体的代码示例。基...
    99+
    2023-10-22
    C++ 多重继承 问题详解
  • 怎么解决PHP单继承问题
    这篇文章给大家分享的是有关怎么解决PHP单继承问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Trait简介Trait是PHP 5.4引入的新概念,看上去既像类又像接口。其实都不是,Trait可以看做类的部分实...
    99+
    2023-06-29
  • JS精髓原型链继承及构造函数继承问题纠正
    目录前言原型链继承构造函数继承组合继承前言 先从面向对象讲起,本瓜认为:面向对象编程,它的最大能力就是:复用! 咱常说,面向对象三大特点,封装、继承、多态。 这三个特点,以&ldqu...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作