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__方法的父类的方法后就结束?
恳请大家指点,感谢!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.