2011-05-31 196 views
2

輸出是:繼承Python和構造函數調用

Class A 
Class B 
printout 

鑑於代碼:

class A(object): 
    def __init__(self): 
     print "Class A" 
    def printout(self): 
     print "printout" 

class B(A): 
    def __init__(self): 
     print "Class B" 

def main(): 
    myA = A() 
    myB = B() 
    myB.printout() 

if __name__ == '__main__': 
    main() 

我希望的:

Class A 
Class A 
Class B 
printout 

的結果...:/

+1

不要在代碼段周圍放置預標籤,它將刪除語法highlig H T。 – Mizipzor 2011-05-31 13:25:57

回答

4

這是因爲你沒有叫超級rclass的__init__

class B(A): 
    def __init__(self): 
     A.__init__(self) 
#  ^^^^^^^^^^^^^^^^ this have to be explicitly added 
     print "Class B" 

在Python 3.x中,你可以使用super().__init__()代替A.__init__(self),但你還是明確地調用父類的__init__

4

您需要顯式調用基類構造函數,像這樣:

class B(A): 
    def __init__(self): 
     super(B, self).__init__() 

在蟒蛇3.0以下是equivilent:

class B(A): 
    def __init__(self): 
     super().__init__() 
1

你沒有打電話給祖先的構造,使用super()爲此呼叫

class B(A): 
    def __init__(self): 
     super(B, self).__init__() 
     print "Class B"