python菱形继承参数问题_菱形继承问题

本文介绍了Python中的菱形继承问题及其解决方式。在Python3中,所有类都是新式类,采用广度优先的搜索策略。新式类的MRO(方法解析顺序)通过C3算法确定,确保了多继承的线性化顺序。C3算法遵循子类优先、多路径时不包含共同祖先等原则,确保了属性查找的一致性。此外,`mro()`方法用于获取类的MRO列表,方便理解和调试继承结构。
摘要由CSDN通过智能技术生成

菱形继承问题

一、类的分类

1.1 新式类

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

Python3中所有的类都是新式类

1.2 经典类

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

只有Python2中才有经典类

二、菱形继承问题

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

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

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

经典类下:深度优先

广度优先:广度优先

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

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

# 继承菱形问题: 新式类和经典类的查找顺序不一样

# 新式类的查找属性:广度优先

# 经典类:深度优先

class G():

a = 'ggg'

class F(G):

a = 'fff'

class E(F):

a = 'eee'

class D(E):

a = 'ddd'

class C(D):

a = 'ccc'

class B(C):

a = 'bbb'

class A(B, C, D):

a = 'aaa'

a = A()

print(a.a)

# mro 列表,查看继承顺利列表(只在新式类中有)

print(A.mro())

print(A.__mro__)

obj = A()

(,)

obj.test() # A->B->E-C-F-D->G-object

from A

继承菱形问题在python3中显示的都是继承一个类,不是object类, 新式类和经典类的查找顺序是不一样

新式类(python3中全是新式类):广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包含菱形顶点),继续下一个继承父类往上找,找到菱形的顶点结束(不包含括菱形的顶点),最后找到菱形顶点

经典类(python2中才有):深度优先搜索---从左侧开始,一直往上找,找到菱形顶点结束(包括菱形顶点),继续下一个继承父类往上找,找到菱形的顶点结束(不包含菱形顶点)

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

[

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

print(A.mro()) # A.__mro__

[, , , , , , , ]

for i in A.mro():

print(i)

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

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

子类会先于父类被检查

多个父类会根据它们在列表中的顺序被检查

如果对下一个类存在两个合法的选择,选择第一个父类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值