请教一个关于多重继承的问题

2017-09-24 23:21:40 +08:00
 saximi
class Init(object):
    def __init__(self,value):
        print("enter Init")
        self.val=value 
class Add2(Init):
    def __init__(self,val):
        print("enter Add2")
        super(Add2,self).__init__(val)
        self.val+=2 
class Mul5(Init):
    def __init__(self,val):
        print("enter Mul5")
        super(Mul5,self).__init__(val)
        self.val*=5 
class Pro(Mul5,Add2): 
    pass
class Incr(Pro):
    csup=super(Pro) 
    def __init__(self,val):
        self.csup.__init__(val)
        self.val+=1
        print("Incr.__init;val=",self.val)
 
p=Incr(5) 
print(p.val)


上面程序输出如下: 
enter Mul5
enter Add2
enter Init  
36

我认为在 Incr()生成实例时的语句执行顺序应该是:
先执行 Incr 定义中的 super.__init__方法,因为父类 Pro 没有__init__方法,便会找到 Pro 的父类 Mul5 的__init__方法,进而通过 super()往上找到 Mul5 的父类 Init,执行完 Init.__init__方法后,Incr 的实例化就算结束了。
但是从输出来看,实际上在执行完 Mul5 的__init__方法后,竟然去执行 Add2 的__init__方法,也就是把 Pro 的两个父类的__init__方法都执行了?

难道说,在执行 Pro 的__init__方法时,会把 Pro 的所有父类都遍历一下,只要其父类有__init__方法的都会去执行,而不是在执行完 Pro 的第一个有__init__方法的父类的方法后就结束?
恳请大家指点,感谢!

1982 次点击
所在节点    Python
3 条回复
zeroten
2017-09-25 00:21:54 +08:00
MRO 的知识,这篇文章讲的挺好的 https://laike9m.com/blog/li-jie-python-super,70/
flaneurse
2017-09-25 01:58:51 +08:00
新式类的确是这样的
flaneurse
2017-09-25 01:59:16 +08:00
看一楼↗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/393308

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX