为了账号安全,请及时绑定邮箱和手机立即绑定

创建D的实例对象,结果为啥不是ABCD

class A(object):
    def __init__(self, a):
        print 'init A...'
        self.a = a

class B(A):
    def __init__(self, a):
        super(B, self).__init__(a)
        
        
        print 'init B...'

class C(A):
    def __init__(self, a):
        super(C, self).__init__(a)
        print 'init C...'

class D(B, C):
    def __init__(self, a):
        super(D, self).__init__(a)
        print 'init D...'


正在回答

6 回答

我个人的是类似栈的先进后出,后继承C,就优先调用C的__init__方法

0 回复 有任何疑惑可以回复我~
#1

qq_染上空白_04172504

抱歉,我的理解有错
2018-08-13 回复 有任何疑惑可以回复我~

这是python2和python3对于继承的init顺序不同。python3是广度优先顺序,python2是深度优先搜索

0 回复 有任何疑惑可以回复我~

这个是那个新式类和旧式类的原因,新式类是广度优先,旧式类是深度优先,当然在3.0版本中默认是新式类,已经没有区别了!

2 回复 有任何疑惑可以回复我~
#1

木易楊__

正解!
2018-07-18 回复 有任何疑惑可以回复我~

init A...

init C...

init B...

init D...

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

可以使用D.__mro__方法查看调用顺序,直到object结束,在调用过程中不会打印,因为还没有执行到,最后依次打印,也就是,这个调用反过来,ACBD。

4 回复 有任何疑惑可以回复我~
class D(B, C):

这里,B C交换位置,结果会不一样,具体原因不知道

0 回复 有任何疑惑可以回复我~

https://img1.sycdn.imooc.com//5aea76bc00013db106750429.jpg结果是ABCD啊

0 回复 有任何疑惑可以回复我~
#1

y931

代码我差不多直接拷你的,没改动
2018-05-03 回复 有任何疑惑可以回复我~
#2

晨济

你这个是ACBD
2018-06-21 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

创建D的实例对象,结果为啥不是ABCD

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信