38讲中课后题super()语句的例子
本帖最后由 leon_xinxin 于 2020-4-9 23:52 编辑如图,明明B和C都是A的子类,是同一等级。为什么在输出D我感觉的时候先执行B再执行C呢?这样输出让人感觉C是B的子类。
求好的解释!
https://ae01.alicdn.com/kf/U3e82a9b8b7af47fa903d4fc77caaad9b8.jpg
https://ae01.alicdn.com/kf/U2d299bc0694e4e96aaca708245fa034ea.jpg 本帖最后由 sunrise085 于 2020-4-10 00:07 编辑
看看这个帖子。
我在这个帖子下回复了好几条,应该能帮你解惑
这是多重继承时初始化函数__init__()的内容,这个涉及到super()和__mro__的用法。
在继承的时候,子类中若需要调用父类的__init__()函数,则需要用super().__init__()。但若是多重继承,什么时候调用哪一个父类的__init__()函数,是由__mro__列表顺序给出的。
在你的这个程序中,D类的__mro__表如下:
<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>
当创建D类的实例化时,会先调用D类的__init__()函数。之后每遇到一次super().__init__()函数就会从上表 中向后找一个父类去执行它的__init__()函数,一直到列表为空或者最后一个执行的__init__()函数中没有super()__init__()函数为止。
我们现在看一下你的程序执行过程:先执行D的__init__()函数,遇到super;然后去执行B的__init__()函数,再次遇到super;接着去执行C的__init__()函数,C中没有遇到super函数,执行完毕之后返回B的__init__()函数;然后返回D的__init__()函数,结束。
假如,C中有super,而B中没有super。那么结果会更短,从D的__init__()函数进入B的__init__()函数,然后返回D的__init__()函数,结束。 本帖最后由 Stubborn 于 2020-4-10 01:09 编辑
一个类的 [`__mro__`](https://docs.python.org/zh-cn/3. ... .html#class.__mro__) 属性的三个准则:
- 子类会先于父类被检查
- 多个父类会根据它们在列表中的顺序被检查
- 如果对下一个类存在两个合法的选择,选择第一个父类
这个属于第一个情况,如果没有同一个父类,那么Mro正常是先检查自身,而后从继承的父类或者兄弟类,从左到右检查,父类如果还存在继承,优先被检查。
但是B,C有同一个父类,所以,Mro的顺序是 D - B - C - A - Object
你可以尝试,去掉C的父类,看下Mro的搜索顺序。结合体验下
class A: pass
class B: pass
class C(A, B): pass
print(C.mro())
# [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
class D:pass
class E(C, D):pass
print(E.mro())
# [<class '.E'>, <class '.C'>, <class '.A'>, <class '.B'>, <class '.D'>, <class 'object'>]
页:
[1]