zoukankan      html  css  js  c++  java
  • 继承顺序之mro线性顺序列表

    class A:
       # def test(self):
       #  print('A')
       pass
    
    class B(A):
       # def test(self):
       #  print('B')
       pass
    
    class C(A):
       # def test(self):
       #  print('c')
       pass
    
    class D(B):
       # def test(self):
       #  print('D')
       pass
    
    class E(C):
       # def test(self):
       #  print('E')
       pass
    
    class F(D,E):
       def test(self):
          print('F')
       # pass
    
    f1 = F()
    f1.test()
    print(F.__mro__) # (<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
    # python3都是新式类,所以依次执行顺序是FDBECA,可以看到最后有个object,其实这个是A类的基类,自动继承了object
    # python2中,当基类为经典类时,那么父类与子类都是经典类;当基类为新式类时,那么父类与子类都是新式类;python2经典类没有__mro__方法
    
    '''
    继承顺序:
    python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是深度优先和广度优先;
    当类是经典类时,多继承情况下,会按照深度优先方式查找(从左至右,左边查到顶级,然后从右边开始查找),F-->D-->B-->A-->E-->C
    当类是新式类时,多继承情况下,会按照广度优先方式查找(从左至右,左边不查到顶级---顶级的下一级,然后从右边开始查找且查找到顶级),F-->D-->B-->E-->C-->A
    '''
    
    '''
    python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表;
    为了实现继承,python会在MRO列表上从左至右开始查找基类,直到找到第一个匹配这个属性的类为止。
    而这个MRO列表的构造是通过一个C3线性化算法实现的,我们不去深究这个算法的数学理论,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:
    1、子类会先于父类被检查
    2、多个父类会根据他们在元组中的顺序被检查
    3、如果对下一个类存在两个合法的选择,选择第一个父类
    '''
    while True: print('studying...')
  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/xuewei95/p/14678037.html
Copyright © 2011-2022 走看看