super之mro列表牵引出c3算法

一:super的使用

class Person(object):
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
		

class Student(Person):
    def __init__(self, name, age, sex):
	super().__init__(name, age, sex)     python3中的写法    表示调用父辈的__init__, 完成初始化
	self.score = 0
	
lisi = Student('李四', 20, '女')
print(lisi.name)

注:
python2写法  表示调用父辈的__init__, 完成初始化
super(Student, self).__init__(name, age, sex)

指名道姓的调用父类的方法 跟继承没有关系   调用类中的__init__函数,完成对self的初始化
Person.__init__(self, name, age, sex)

python3中的写法    表示调用父辈的__init__, 完成初始化
super().__init__(name, age, sex) 

二: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'>]

posted @ 2021-12-07 00:42  AlexEvans  阅读(46)  评论(0编辑  收藏  举报