zoukankan      html  css  js  c++  java
  • day21-4 菱形继承问题(类的查找顺序)

    菱形继承问题

    在Python中子类可以同时继承多个父类,如A(B,C,D)

    • 如果继承关系为非菱形结构,则会按照先找B这一条分支,然后再找C这条分支,最后找D这条分支的顺序直到找到我们想要的属性
    • 如果继承关系为菱形结构,即子类的父类最后继承了同一个类,那么属性的查找方式有两种
    class G:
        def test(self):
            print('from G')
    
    
    class F(G):
        def test(self):
            print('from F')
    
    
    class E(G):
        def test(self):
            print('from E')
    
    
    class D(G):
        def test(self):
            print('from D')
    
    
    class C(F):
        def test(self):
            print('from C')
    
    
    class B(E):
        def test(self):
            print('from B')
    
    
    class A(B, C, D):
        def test(self):
            print('from A')
    
    a = A()
    

    经典类(了解)

    一条路走到黑,深度优先

    查找顺序:A -> B -> E -> G -> C -> F -> D

    新式类

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

    查找顺序:A -> B -> E -> C -> F -> D -> G

    mro方法

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

    print(A.__mro__)  # 在此用python3运行,广度优先
    
    (<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'>
    
  • 相关阅读:
    初识 Image,region,xld(1)
    Opencv 滤波<11>
    Opencv 掩模<10>
    事件
    Ubuntu16 安装Anaconda3+tensorflow cpu版
    Windows10:Opencv4.0+Opencv4.0.1_contrib编译
    Qt5连接Mysql环境配置
    Qt5显示中文字符
    如何为多个VLAN配置DHCP?
    二层网络架构,接入交换机和核心交换机
  • 原文地址:https://www.cnblogs.com/863652104kai/p/11052778.html
Copyright © 2011-2022 走看看