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__方法的父类的方法后就结束?
恳请大家指点,感谢!
1
zeroten 2017-09-25 00:21:54 +08:00 1
MRO 的知识,这篇文章讲的挺好的 https://laike9m.com/blog/li-jie-python-super,70/
|
2
flaneurse 2017-09-25 01:58:51 +08:00
新式类的确是这样的
|
3
flaneurse 2017-09-25 01:59:16 +08:00
看一楼↗
|