python 多个父类 子类_Python基础教程:菱形继承问题

本文介绍了Python中的类分类,包括新式类与经典类的区别,并重点讨论了菱形继承问题。在Python中,子类可以同时继承多个父类,当遇到菱形继承时,新式类采用广度优先搜索策略,而经典类则采取深度优先。文章还提到了C3线性化算法和mro()方法,这两个概念用于确定方法解析顺序,保证多继承时的属性查找顺序。C3算法确保了MRO列表的构造遵循特定规则,使得继承关系更加有序。
摘要由CSDN通过智能技术生成

一、类的分类

1.1 新式类

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

1.2 经典类

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

二、菱形继承问题

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

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

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

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

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

282d4d7c718649461c7ec26cc472cd03.png

28c79d0aac67a072f510b8d3bde95eb6.png

三、C3算法与mro()方法介绍

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

d019c76fbd84b9d1095349657364a18f.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值