2015-09-06 55 views
1

我想在python中使用super擴展我的類的初始化。在下面的例子中,我想Class A初始化一個參數乘以4,我希望這個參數通過繼承在類B中可用。然後,我想在B中進行另一個初始化,以取得相同的參數並將其乘以8。這第二個初始化沒有在A.可用使用'super'的例子在Python2.7中

class A(): 
    def __init__(self,parameter): 
     self.initialize_parameter=4*parameter 

class B(A): 
    def __init__(self,parameter): #note this parameter is intended to be the same parameter from Class A 
     self.another_parameter=parameter*8 
     super(B,self).__init__(parameter) 

我一直在閱讀似乎表明,上面是正確的語法(我認爲),但在這個問題上的文檔的文件是相當混亂。以上代碼返回TypeError: must be type, not classobj

這是我第一次使用繼承,任何人都可以建議我做錯了什麼?

+0

FWIW,更常見的做法是將__init__(如果您需要調用它)作爲子__init__中的第一個命令調用,而不是在最後執行。這樣,子初始化器就可以輕鬆地覆蓋或增加超級初始化器完成的工作。 –

回答

5

正確的語法是class A(object)而不是Class A()

請注意,我的關鍵字class(這導致我相信你的代碼不是複製粘貼的 - 這是一個壞主意,要求你沒有嘗試運行的代碼的幫助!),並且還在parens中添加了object這個詞,將其標記爲一個新類型的Python類。後者是慣用的,如果不是絕對必要的話。

當我嘗試完全按照你寫的代碼運行你的代碼時,我得到了SyntaxError: invalid syntax。當我小寫class這個詞時,我在Python 2.7上完全沒有錯誤。

+1

值得一提的是'super'不被舊式類支持,即那些最終不會從'object'繼承的類。這就是TypeError異常的原因。 – mhawke

+0

是的,你是對的。我試圖在沒有真正測試代碼的情況下抽象出我的情況,並且明顯犯了錯誤 - 一個壞主意,指向 – CiaranWelsh

+0

您是否在我的示例中指定將參數添加到類定義中,即第一行將是'class A(parameter )'? – CiaranWelsh