设为首页 加入收藏

TOP

Python学习日记(二十四) 继承(三)
2019-09-07 07:09:06 】 浏览:94
Tags:Python 学习 日记 二十四 继承
class A:
    def fuc(self):
        print('A')
class C(A):
    def fuc(self):
        print('C')
class D(A):
    def fuc(self):
        print('D')
class B(C,D):
    def fuc(self):
        print('B')
b = B()
print(B.mro())  #[<class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>]
结果

在这里为什么先找的是D而不是A呢?虽然python在找的时候它其实已经知道了C后面有一个A,但是它要优先遵循从左往右的方向去找并且C->A,D->A,如果它直接找到A的话那么D的节点就会丢失,如果一个节点丢失的话就再也找不回来了,所以第三次结果它打印了D。

<2>乌龟继承:

这些类的继承关系如下图表示

class A:
    def fuc(self):
        print('A')
class B(A):
    def fuc(self):
        print('B')
class F(A):
    def fuc(self):
        print('F')
class C(B):
    def fuc(self):
        print('C')
class E(F):
    def fuc(self):
        print('E')
class D(E,C):
    def fuc(self):
        print('D')
print(D.mro()) 
#[<class '__main__.D'>, <class '__main__.E'>, <class '__main__.F'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]

这种记录继承顺序它是新式类的继承顺序,所遵循的是广度优先

而在python2.7中就是经典类,它所遵循的深度优先即走过的路就不走了,在这里的结果就是D->E->F->A->C->B

总结:

如果是多个父类中有一个方法的名字都相同,一个子类继承了这些父类,当它去用这个方法的时候,它会优先从左往右去找

python2.7 新式类和经典类共存,新式类要继承object

python3 只有新式类,默认继承object

经典类和新式类还有一个区别就是mro方法之在新式类存在

 

super的本质

用到上面钻石继承的继承关系图,但代码稍微改动

class A:
    def fuc(self):
        print('A')
class C(A):
    def fuc(self):
        super().fuc()
        print('C')
class D(A):
    def fuc(self):
        super().fuc()
        print('D')
class B(C,D):
    def fuc(self):
        super().fuc()
        print('B')
b = B()
b.fuc()
# A
# D
# C
# B

super它的本质不是单纯找父类,而是根据调用者的节点位置的广度优先顺序来找的

具体执行流程:

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇01-jQuery的介绍 下一篇02-jQuery的选择器

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目