2016-04-21 61 views
2

如果我運行此代碼:Python類的實例變量繼承力學

class Super:  
    def __init__(self, name): 
     self.name = name 


class Sub(Super): 
    def publ(self): 
     print("works") 

a = Sub() 

按計劃它成功地失敗,此消息:

TypeError: __init__() takes exactly 2 arguments (1 given) 

,但它給了我竊聽問題:

在哪裏這些信息是關於參數條目的子類需求存儲的?我的意思是如何SUB()知道它需要「名稱」作爲參數? 什麼是定義它如何從Super()繼承「知識」的機制。

回答

2

Python教程has a section on inheritance

如果在類中未找到請求的屬性,則搜索繼續查找基類。如果基類本身是從其他類派生的,則此規則將遞歸應用。

當你調用Sub()是解釋看起來類對象名爲__init__屬性會發生什麼。如果它找到一個它會使用它。如果它沒有找到它(在你的例子中就是這種情況),它將搜索類的基類。在你的例子中,它發現從Super類繼承的__init__方法。口譯員將繼續調用該方法。

您可以修復在以下任一方式的例子:

a = Sub('John Doe') 

或:

class Sub(Super): 
    def __init__(self): 
     super(Sub, self).__init__("My Name Is Sub") 

    def publ(self): 
     print("works") 
+0

那麼,有沒有方法來檢索通過子超() 「name」 屬性?像這樣:a .__ class __.__ bases __ [0] .__ dict__ –

+0

通常引用一個屬性。例如'print(「我有一個名字:」,self.name)' – dsh

+0

我看起來更像是一個元信息。可以說我不需要這樣的價值。我正在尋找結構和關係類型信息。 是否有「Xpath like」的方式來檢查Super()將需要什麼,因爲當我檢查「a .__ class __.__ bases __ [0] .__ dict__」時,它會在dict中顯示我__init__,但它不會顯示「name」 。其中Sub()「將」該名稱視爲它將使用的元信息,並且有一種方法可以從實例Sub()透視圖中看到它。 –