python super()
http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035005.html
這篇文章介紹了super的用法,我看了這段代碼不懂:
class A(object):
def __init__(self):
print "enter A"
print "leave A"
class B(object):
def __init__(self):
print "enter B"
print "leave B"
class C(A):
def __init__(self):
print "enter C"
super(C, self).__init__()
print "leave C"
class D(A):
def __init__(self):
print "enter D"
super(D, self).__init__()
print "leave D"
class E(B, C):
def __init__(self):
print "enter E"
B.__init__(self)
C.__init__(self)
print "leave E"
class F(E, D):
def __init__(self):
print "enter F"
E.__init__(self)
D.__init__(self)
print "leave F"
f = F() result:
enter F
enter E
enter B
leave B
enter C
enter D
enter A
leave A
leave D
leave C
leave E
enter D
enter A
leave A
leave D
leave F
為什么多了一層d
在輸出的第六行為何多了enter d
和我想象的不一樣:
C2{QYV~BBNDMBJ2W$29@9~T.jpg
文章里說扭粱,
mro中記錄了一個(gè)類的所有基類的類類型序列灭必。查看mro的記錄理肺,發(fā)覺包含7個(gè)元素,7個(gè)類名分別為:
F E B C D A object
“從而說明了為什么在C.init中使用super(C, self).init()會(huì)調(diào)用類D的初始化函數(shù)了云茸。 ???”
代碼改成:
class A(object):
def __init__(self):
print "enter A"
super(A, self).__init__() # new
print "leave A"
class B(object):
def __init__(self):
print "enter B"
super(B, self).__init__() # new
print "leave B"
class C(A):
def __init__(self):
print "enter C"
super(C, self).__init__()
print "leave C"
class D(A):
def __init__(self):
print "enter D"
super(D, self).__init__()
print "leave D"
class E(B, C):
def __init__(self):
print "enter E"
super(E, self).__init__() # change
print "leave E"
class F(E, D):
def __init__(self):
print "enter F"
super(F, self).__init__() # change
print "leave F"
f= F():
enter F
enter E
enter B
enter C
enter D
enter A
leave A
leave D
leave C
leave B
leave E
leave F
看不懂也是目。
立個(gè)flag
需要搞懂的有:
經(jīng)典類和新式類
MRO算法
多態(tài)繼承
深度優(yōu)先和廣度優(yōu)先