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'>
    
  • 相关阅读:
    端口查看netstat -tunpl |grep 25
    解释一下查找出文件并删除find /var/log -type f -mtime +7 -ok rm {} ;
    2021.6.2
    2021.6.1
    2021.5.31
    2021.5.30(每周总结)
    2021.5.28
    2021.5.27
    2021.5.26
    2021.5.25
  • 原文地址:https://www.cnblogs.com/863652104kai/p/11052778.html
Copyright © 2011-2022 走看看