python3 多继承的广度优先解惑
疑惑:认为 python3 中的广度优先 是按自左往右的优先级继承的的,但实际操作中会有错误
回答: 广度优先 不是按照简单的自左往右的优先级继承的,它是在深度继承的基础上,再按自左往右的优先级进行的
初学python,写一下对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('D类中的方法')
class E(C,D):
pass
>>> h = E()
>h.pt() # 会得到 A类中的方法
>A类中的方法
**如果是广度优先,你会不会认为输出应该是:
D类中的方法**
深度优先和广度优先下,上面类的继承顺序都是这样的 :
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类中的方法
#深度优先的继承顺序为: D < B < A < C
#如果使用广度优先就会输出: C类中的方法
# 广度优先的继承顺序为:D < B < C < A
- 例一 中,继承采用广度优先或者深度优先,子类继承的顺序是相同的,都为 E < C < A < D < B. 深度优先好理解,从第一个类继承,没有就查找第一个类的父类. 广度优先的继承顺序也是这样,为什么呢?
- 例二 中,继承采用深度优先的继承方式时, D < B < A < C 的顺序也好理解,因为 D类继承属性时,如果是同名属性,B 的优先级最高,B中有,就继承类 B 中的该属性, 如果 B 中没有, A 与 C中有, 遵从深度优先,先继承 B 的父类 A 中的该属性, C 的优先级最低
- 我们再使用广度优先看一下例二:继承顺序 是 D < B < C < A,从这个例子看,好像是从第一层父类中从左到右继承,实际上不是这样的.类 B 拥有最高的被继承优先级,若 是 B 中没有的属性, A 和 C 中都有该属性或方法, 会查看 C 是否为 A 的子类,若 C 为 A 的子类,则继承 C 中的该同名属性与方法,如果不是的话,则继承 类 A 中的属性与方法。
看到这里是否能理解例一中,广度优先时,类的继承顺序呢.
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 初学者,自己的体悟,如有错误,欢迎指正