关于super()函数

关于super()函数

class A():
   def __init__(self):
       print('enterA')
       print('leaveA')

class B(A):
   def __init__(self):
       print('enterB')
       super().__init__()
       print('leaveB')
class C(A):
   def __init__(self):
       print('enterC')
       super().__init__()
       print('leaveC')
class D(B,C):
   def __init__(self):
       print('enterD')
       super().__init__()
       print('leaveD')
d = D()

执行结果为:

enterD

enterB

enterC

enterA

leaveA

leaveC

leaveB

leaveD

能请讲解下问什么是这样的执行顺序吗,重复的部分也只调用一次

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好:

B、C继承于A,D继承于B,C,形成闭合的条件。

同学继承的顺序是先继承B,再继承C。

http://img1.sycdn.imooc.com//climg/5e0eb58609e7c29d01260028.jpg

那么继承调用的顺序为(MRO:方法解析顺序):

http://img1.sycdn.imooc.com//climg/5e0eb603090470af10660132.jpg

同学所有子类中都定义了继承父类的构造函数,那么执行的顺序。参考红线(广度遍历)。

http://img1.sycdn.imooc.com//climg/5e0eb52809c8d34903610326.jpg

从D开始执行代码,遇到继承的构造函数,那么向下寻找到B,执行B的构造函数代码,遇到B中有继承构造函数,继续向下寻找到C,执行C中的构造函数代码,遇到C中有继承构造函数,继续寻找到A。执行A构造函数中的代码,然后返回执行剩余没有执行完的代码。

代码的执行顺序根据上面顺序执行。

http://img1.sycdn.imooc.com//climg/5e0eb7e10949740804840610.jpg

B和C其中C没有继承A的构造函数,由于B中继承了构造函数,那么会继续向下寻找到C,执行C中的构造函数,C中没有继承A的构造函数,结束代码的执行。

http://img1.sycdn.imooc.com//climg/5e0eb88209249bd604320865.jpg

如果我解决了同学的问题,请采纳!学习愉快^_^。

  • 慕沐2042916 提问者 #1
    我想知道为什么执行B的构造函数代码,遇到B中有继承构造函数,不是去执行A的构造函数,,而去执行C的构造函数,B不是继承于A吗
    2020-01-03 12:16:49
  • 好帮手乔木 回复 提问者 慕沐2042916 #2
    同学你好:首先python的多重继承是根据MRO来确定类的继承顺序。MRO(method resolution order),对于你定义的每个类,python都会计算出一个方法解析顺序,它代表了类继承的顺序。上面的回答中我们已经得到了该继承的顺序:D->B->C->A。所以当同学继承构造函数时执行的顺序就是按照MRO的顺序执行。流程:从D开始执行代码,遇到继承的构造函数,那么向下寻找到B,执行B的构造函数代码,遇到B中有继承构造函数,继续向下寻找到C,执行C中的构造函数代码,遇到C中有继承构造函数,继续寻找到A。执行A构造函数中的代码,然后返回执行剩余没有执行完的代码。学习愉快^_^。
    2020-01-03 14:00:03
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师