2011-03-02 38 views
39

我是python的執行者。我無法理解繼承和__init__()Python中的繼承和初始化方法

class Num: 
    def __init__(self,num): 
     self.n1 = num 

class Num2(Num): 
    def show(self): 
     print self.n1 

mynumber = Num2(8) 
mynumber.show() 

結果:8

這是可行的。 Error. Num2 has no attribute "n1".

在這種情況下,怎麼能Num2訪問n1:但是我

class Num2(Num): 
    def __init__(self,num): 
     self.n2 = num*2 
    def show(self): 
     print self.n1,self.n2 

結果替換Num2

回答

72

的初始化在第一種情況下,Num2是擴展類Num因爲你不重新定義特殊方法__init__()Num2,它從Num繼承。

當一個類定義了__init__() 方法,類的實例化 自動調用__init__()爲 新創建的類實例。

在第二種情況下,因爲你是在Num2重新定義__init__()你需要顯式調用之一,如果你想擴展它的行爲的超類(Num)。

class Num2(Num): 
    def __init__(self,num): 
     Num.__init__(self,num) 
     self.n2 = num*2 
+12

您的引用不足以解釋爲什麼在派生類中未定義'__init__'方法時,它會被繼承。這是因爲_「如果在該類中沒有找到請求的屬性,搜索將繼續查找基類。」_(doc) – eyquem 2011-08-14 22:08:22

+0

對不起......基本上,繼承是如何工作的......如果繼承一個類,你得到整個包,所以,超類中的所有東西都存在於子類中。但是,如果你重新定義了一個方法,它會被覆蓋......這就是你的代碼。 – coya 2017-05-05 19:46:09

2

由於您沒有撥打Num.__init__,因此永遠不會創建字段「n1」。調用它,然後它會在那裏。