2016-08-31 65 views
-1

案例1:什麼是happning在這裏是否蟒蛇覆蓋

class A(object): 
    def __init__(self): 
     print "A" 
class B(A): 
    pass 
c = b() 
#output: 
#A 

案例2:

class A(object): 
    def __init__(self): 
     print "A" 
class B(A): 
    def __init__(self): 
     print "B" 
c = b() 
#output: 
#B 

在案例1運行的class A構造和情形2它運行構造函數爲class B

因此,如果case1打印A被理解爲它正在運行class A構造函數,因爲class B已繼承它。

然後在case2它只運行class B構造函數,但不是class A構造函數爲什麼。

現在發生了什麼在這裏。 python覆蓋了class A構造函數嗎?或者發生了什麼 「我是編程新手。」

+3

*初始值*被覆蓋。父*初始值*可以使用'super'訪問。 –

+1

如果你在'B'中放置了一個'__init__',它將覆蓋'A'中的一個。如果你不這樣做,它不會。 Pythons'__init__'方法不會自動調用超類的'__init__'方法。我不知道爲什麼你在標題中加入「過載」。 – khelwood

+1

*「按照OOP的概念,構造函數不能被繼承。」* - 說誰? – deceze

回答

2

根據文檔,當一個類被構造時,基類總是被記住。因此,如果沒有找到某個屬性,它將解決所有的依賴關係,這個過程在所有基類中都起作用。在你的情況下,類B沒有init方法,所以它調用它的父方法。在第二個例子中,如果想運行基類的構造函數,可以使用super()函數。