探讨python 3中的广度优先
程序员文章站
2022-03-03 11:17:54
...
python3 多继承的广度优先
初学python,写一下对python3 中多继承的理解,如有错误,欢迎指正
- python3 中的类采用广度优先,但是这个广度优先是在深度优先的某种基础上做的。
- 深度优先好理解,就是从继承的第一个类中查找子类中没有的方法或属性,如果第一个父类中没有,就查找这个父类的父类中是否有,如果父类继承自两个类,就查找它继承的第一个类,如果没有就继续向上层继承的类中查找。
类A,B ,类 C(A,B),D(A,B) ,类E(C,D)
创建类E的实例,e = E(), 使用 e 的方法,如果 e 中没有,就查找 父类 C中是否有,
如果没有向上查找 A 中有没有,如果还没有,查找 B,B中没有再从第一层继承向右查找
查找顺序 E< C < A < B < D
- 下面我们来看,为什么说广度优先是在深度优先的基础上进行的
- 广度优先
例一:
class A:
def pt(self):
print('A类中的方法')
class B:
def pt(self):
print('B类中的方法')
class C(A):
pass
class D(B):
def pt(self):
print('Dl类中的方法')
class E(C,D):
pass
>>> h = E()
>h.pt() # 会得到 A类中的方法
>A类中的方法
上面的继承顺序是这样的 : E < C < A < D < B
再看下面的额例子:
例二:
class A:
def pt('A类中的方法')
class B(A):
pass
class C(A):
def pt('C类中的方法')
class D(B,C):
pass
>>> d = D()
>d.pt()
#上面的代码如果使用深度优先,就会输出:A类中的方法
#如果使用广度优先就会输出: C类中的方法
深度优先上面讲了,我们来看广度优先。
它的继承顺序 是 D < B < C < A,从这个例子看好像是从第一层父类中从左到右继承,实际上我们结合 例一 去看,就知道不是这样的,它是先从 B的 父类 A中查找过,发现有继承的可能性,而又向下 查看了 A 中的子类C中有重写该方法,而C也是类 D 的父类,最终选定从 C中继承。
class A
class B(A) class C(A)
class D(B) class E(C)
class F(D,E)
我在看网上教程时,刚开始以为继承顺序为:
F < D < E < B < C < A
实际上的继承顺序应该为:
F < D < B < E < C < A
先深度,在深度的基础上广度
python 初学者,自己的体悟,如有错误,欢迎指正
上一篇: DS树+图综合练习--构建邻接表
下一篇: [图] 0 总结 - 记忆版