继承类__init__为什么不会自动调用所有基类的__init__?

JeanLove 2018-05-19 12:57:55
从java/c++转到python的新手,研究了下对象模型,多继承,有些明白下面这个:

class A:
def __init__(self):
print 'this is A'
class B(A):
def __init__(self):
print 'this is B'
class C(A):
def __init__(self):
print 'this is C'
class D(B,C):
def __init__(self):
print 'this is D'
d1=D()

代码打印

this is D

我非常不理解:既然D是从B和C同时继承的,那么__init__不会自动调用到B和C的__init__吗?
如果我把D的__init__注释掉,那么会打印

this is B

好奇怪,难道C不是它的基类吗,为什么只打印了B的__init?
...全文
964 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
欢乐的小猪 2018-05-21
  • 打赏
  • 举报
回复
如果想要printB则加super去调用
class A:
    def __init__(self):
        print('this is A')
class B(A):
    def __init__(self):
        print('this is B')
class C(A):
    def __init__(self):
        print ('this is C')
class D(B,C):
    def __init__(self):
        super().__init__()
        print( 'this is D')
d1=D()
当然你继承自两个类B,C是有顺序的,因为B和C都是你自定义的类,所以就按左右顺序来。你把B的init函数删掉,则super会调用C的init函数
  • 打赏
  • 举报
回复
class D(B,C): def __init__(self): print 'this is D' 你在D里面写了__init__就相当于重写了父类的__init__方法,你直接调用就是使用D的init,如果想使用B或C的需要使用super, 还有就是,基础B和C是有顺序的,这里可以使用魔法属性__mro__来查看属性和方法的查找顺序

37,718

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧