探讨python 3中的广度优先

本文深入探讨了Python3中多继承的广度优先与深度优先原则,通过具体示例对比了两种继承方式下类的查找顺序,揭示了广度优先是在深度优先基础上,自左往右查找的真相。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值