小言_互联网的博客

探讨python 3中的广度优先

319人阅读  评论(0)

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


转载:https://blog.csdn.net/xiaoliguode/article/details/101028944
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场