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

我觉得已经写得很对了,为什么还是报错?

class A(object):

    def __init__(self, a):

        print 'init A...'

        self.a = a

 

class B(A):

    def __init__(self, a , b):

        super(B, self).__init__(a)

        print 'init B...'

        self.b = b

 

class C(A):

    def __init__(self, a,b,c):

        super(C, self).__init__(a)

        print 'init C...'

        self.c = c

        self.b=b

 

class D(B, C):

    def __init__(self, a,b,c,d):

        B.__init__(self,a,b)

        C.__init__(self,a,b,c)

        print 'init D...'

        self.d = d

g=D('a','d','f','g')

错在哪里了

正在回答

4 回答

如上所诉类名调用和super不要混用  ,当用类名调用时——用的是广度算法,super调用C3算法

class A(object):pass
class B(A):pass
class C(B):pass
class D(A):pass
class E(D):pass
class F(C, E):pass


按照广度优先遍历,F的MRO序列应该是[F,C,E,B,D,A]
但是C3是[F,E,D,C,B,A]


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

'''

类名调用和super调用父类不要同时使用,

全使用super时,ABC三个类所需参数不同,但是super在D接受的参数会直接去匹配父类发现与父类的init参数个数不同就会报错,ABC所需参数数目相同时也可以执行

全使用类名调用时,正确,但是会调用两次A类

类名调用与super调用父类的算法是不同的,一个是深度优先一个是c3算法,具体参考这里http://www.jb51.net/article/57263.htm,看的我有点晕,但是我认为就是两种调用方法的冲突引起的

'''

class A(object):

    def __init__(self, a):

        print 'init A...'

        self.a = a

 

class B(A):

    def __init__(self, a , b):

        A.__init__(self,a)

        print 'init B...'

        self.b = b

 

class C(A):

    def __init__(self, a,b,c):

        A.__init__(self,a)

        print 'init C...'

        self.c = c

        self.b=b

 

class D(B, C):

    def __init__(self, a,b,c,d):

        B.__init__(self,a,b)

        C.__init__(self,a,b,c)

        print 'init D...'

        self.d = d

g=D('a','d','f','g')



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

谢谢,可以去掉是因为B的特性都包含在了C之中,那如果B中的特性是C中没有的怎么办那?像这样的情况。我这么写就不对了,正确的应该怎么写那?http://img1.sycdn.imooc.com//599936db0001ba8302800361.jpg

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

在D中去掉B的初始化

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

举报

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

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

进入课程

我觉得已经写得很对了,为什么还是报错?

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号