欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

探讨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 初学者,自己的体悟,如有错误,欢迎指正