2013-02-25 275 views
1

我只是有一個關於初始化的小問題。在Python中,當我們做一個Multiply繼承時,調用子類的超級函數並將它們分開調用的區別是什麼?類初始化

classA(B,C) 

super(A,self).__init__() 

#---and---# 

B.__init__(self) 
C.__init__(self) 

感謝

+0

會發生什麼你的意思是在''''__init __()'方法的*裏放置'super()'*?請修復你的代碼,這段代碼會生成(顯而易見的)IndentationError,以及'classA'的NameError。 – 2013-02-25 15:04:40

+0

哦,對不起。我簡單地寫了:D – illunara 2013-02-25 15:16:19

回答

1

的主要區別是,如果類B和C有着共同的祖先,與super()呼叫,該祖先的__init__()纔會被調用一次。通過明確地調用父母的__init__()方法,共同祖先的__init__()將最終被調用兩次。

你可以閱讀關於super()如何從Guido's explanation完成此操作。

下面是顯式調用的示範家長__init__()以及它如何調用共同的祖先兩次:

>>> class A(object): 
... def __init__(self): 
...  print "A" 
... 
>>> class B(A): 
... def __init__(self): 
...  A.__init__(self) 
...  print "B" 
... 
>>> class C(A): 
... def __init__(self): 
...  A.__init__(self) 
...  print "C" 
... 
>>> class D(B,C): 
... def __init__(self): 
...  B.__init__(self) 
...  C.__init__(self) 
...  print "D" 
... 
>>> D() 
A 
B 
A 
C 
D 
<__main__.D object at 0x106de1d10> 
>>> 

這是super()

>>> class A(object): 
... def __init__(self): 
...  print "A" 
... 
>>> class B(A): 
... def __init__(self): 
...  super(B,self).__init__() 
...  print "B" 
... 
>>> class C(A): 
... def __init__(self): 
...  super(C,self).__init__() 
...  print "C" 
... 
>>> class D(B,C): 
... def __init__(self): 
...  super(D,self).__init__() 
...  print "D" 
... 
>>> D() 
A 
C 
B 
D 
<__main__.D object at 0x10d34ec90> 
>>> 
+0

啊,我明白了。感謝了很多:D – illunara 2013-02-25 15:26:50