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...')
  • 相关阅读:
    transition过渡效果
    transform旋转变换效果
    让字体在div容器中垂直居中
    背景图片浮动居中
    解决图片浮动调节不了的问题(使用vertical-align属性)
    box-shadow向元素添加阴影效果
    hr中间插入字体
    codeforces 659D . Bicycle Race 几何
    codeforces 659E . New Reform 强连通
    codeforces 552 E. Vanya and Brackets 表达式求值
  • 原文地址:https://www.cnblogs.com/xuewei95/p/14678037.html
Copyright © 2011-2022 走看看