铁乐学python_钻石继承

钻石继承

以下内容大部分摘自博客
http://www.cnblogs.com/Eva-J/

继承顺序

class A(object):
    def test(self):
        print('from A')

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

class C(A):
    def test(self):
        print('from C')

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

class E(C):
    def test(self):
        print('from E')

class F(D,E):
    # def test(self):
    #     print('from F')
    pass
f1=F()
f1.test()
print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性

#新式类继承顺序:F->D->B->E->C->A
#经典类继承顺序:F->D->B->A->E->C
#python3中统一都是新式类
#pyhon2中才分新式类与经典类

继承原理
python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,
这个MRO列表就是一个简单的所有基类的线性顺序列表,例如:

>>> F.mro() #等同于F.__mro__
[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。
而这个MRO列表的构造是通过一个C3线性化算法来实现的。

我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:
1.子类会先于父类被检查;
2.多个父类会根据它们在列表中的顺序被检查;
3.如果对下一个类存在两个合法的选择,选择第一个父类。

继承小结

继承的作用

减少代码的重用
提高代码可读性
规范编程模式

几个名词
抽象:抽象即抽取类似或者说比较像的部分。是一个从具体到抽象的过程。
继承:子类继承了父类的方法和属性。
派生:子类在父类方法和属性的基础上产生了新的方法和属性。

抽象类与接口类

1.多继承问题
在继承抽象类的过程中,我们应该尽量避免多继承;
而在继承接口的时候,我们反而鼓励你来多继承接口

2.方法的实现
在抽象类中,我们可以对一些抽象方法做出基础实现;
而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现

钻石继承
新式类:广度优先
经典类:深度优先

end
2018-4-16

发表评论

电子邮件地址不会被公开。 必填项已用*标注

4 − 3 =