Python中关于多重继承的问题请教

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__方法的父类的方法后就结束? 恳请大家指点,感谢!


Python中关于多重继承的问题请教

4 回复

MRO 的知识,这篇文章讲的挺好的 https://laike9m.com/blog/li-jie-python-super,70/


我无法理解你的问题

新式类的确是这样的

看一楼↗

回到顶部