首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >菱形继承问题

菱形继承问题

作者头像
py3study
发布2020-01-15 01:08:09
6770
发布2020-01-15 01:08:09
举报
文章被收录于专栏:python3python3

类的分类

新式类

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

经典类

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

菱形继承问题

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

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

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

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

  • 经典类下:深度优先
  • 广度优先:广度优先
  • 经典类:一条路走到黑,深度优先
92-菱形继承问题-经典类.png
92-菱形继承问题-经典类.png
  • 新式类:不找多各类最后继承的同一个类,直接去找下一个父类,广度优先
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

C3算法与mro()方法介绍

92-菱形继承问题-飞船原理.jpg
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. 如果对下一个类存在两个合法的选择,选择第一个父类
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 类的分类
    • 新式类
      • 经典类
      • 菱形继承问题
      • C3算法与mro()方法介绍
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档