C/C++教程

super之mro列表牵引出c3算法

本文主要是介绍super之mro列表牵引出c3算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • 一:super之mro列表牵引出c3算法
  • 二:mro列表总结使用

一:super之mro列表牵引出c3算法

print(C.__mro__)   
结果:(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)


class A:
    def test(self):
        print('from A.test')
        super().test()    ————》到B--->object  c3线性算法


class B:
    def test(self):
        print('from B')


class C(A, B):
    pass


c = C()
c.test()    结果: from A.test   from B
牵扯到mro列表
print(C.__mro__)  
结果:(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

顺序 c3线性算法


为了实现继承,python会在mro列表从左往右开始查找基类,直到找到第一个匹配这个属性的类为止
而这个mro列表是通过一个c3线性算法来实现的,我们不去深究这个算法的数学原理,它实际上就是合并所以父类的mro列表并遵循如下三条
1.子类会先余父类被检查
2.多个父类会根据他们在列表的顺序被检查
3.如果对下一个类存在两个合法选择,选择第一个父类

image

二:mro列表总结使用

1.到我们碰倒super 难以分析  
使用print(C.mro())  
打印查找顺序:[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
获取super的顺序流程
class B:
    def test(self):
        print('B---->test')

    def aaa(self):
        print('B---->aaa')

class A:
    def test(self):
        print('A---->test')
        super().aaa()


class C(A, B):
    def aaa(self):
        print('C----->aaa')


c = C()
c.test()   打印结果: 'A---->test  B---->aaa
print(C.mro())   打印查找顺序:[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]

这篇关于super之mro列表牵引出c3算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!