2013-10-29 87 views
0

我有這樣的:python子類是否必須調用它們的超類構造函數?

#!/usr/bin/env python 
class myclass1(object): 
    def __init__(self, arg1):    
     self.var1 = arg1   

class myclass2(myclass1): 
    def f1(self): 
     print "in f1"    

class myclass3(myclass1): 
    def __init__(self, arg1):   
     self.var2 = arg1    
     self.c2 = myclass2() 

p= myclass3(5) 

這給了我一個錯誤:

Traceback (most recent call last): 
File "./pythoninherit.py", line 39, in <module> 
p= myclass3(5) 
File "./pythoninherit.py", line 29, in __init__ 
self.c2 = myclass2() 
TypeError: __init__() takes exactly 2 arguments (1 given) 

問: 爲什麼錯誤給出?

爲什麼在這種情況下自動調用myclass1 __init__

我的印象是,這不會發生在python中。

+4

的'__init__'方法是繼承。 'class1'中的'__init__'方法需要一個參數,並且您沒有參數就調用它。 –

+0

,因爲您沒有用足夠的參數調用'__init__'。所以要回答你的標題「是」。當你構造你的子類時,你需要傳遞將傳遞給父類的參數。 – Cfreak

+0

@IsmailBadawi請將此添加爲答案。 – abc

回答

2

myclass1中的__init__方法由myclass2繼承。當你實例化myclass2時,你從myclass1調用__init__方法,但它需要一個參數,而你沒有通過它。

0

的問題是,myclass2是MyClass1的一個子類,你不及格ARG1對

self.c2 = myclass2() 

需求myclass2是

self.c2 = myclass2(arg1) 

所以myclass2呼籲MyClass1的的__init__這是期待一個參數

2

他們並不總是必須這樣做,但如果他們要改變方法,他們必須重寫基礎__init__初始化工作。如果基類需要一個參數來初始化,而子類不需要,那麼該子類正在改變API並需要編寫自己的__init__。 (無論是調用基類取決於它是否要繼承基INIT行爲。)

在你的榜樣,myclass2繼承MyClass1的的__init__,但是當你做myclass2()你不傳遞參數,所以它不起作用。如果您希望能夠在不傳遞參數的情況下實例化myclass2,則需要編寫它的__init__以允許執行此操作。

0

喜歡你給5作爲參數爲myclass3,你必須給的東西myclass2myclass3,如:

class myclass3(myclass1): 
    def __init__(self, arg1):   
     self.var2 = arg1    
     self.c2 = myclass2(5) 
相關問題