2017-05-19 45 views
0

我創建了一個「動物」類,它接受參數namecolour以及一個名爲「Pig」的子類,它應該繼承namecolour來自「Animal」,但也應該採用新參數TailTypePython超級構造函數 - 你把哪些參數放在子方法中?

這是我到目前爲止已經完成:

class Animal(object): 
    def __init__(self, name, colour): 
     self.name = name 
     self.colour = colour 

    def get_name(self): 
     return self.name 

    def set_name(self, newName = ""): 
     self.name = newName 

    def set_colour(self, newColour = ""): 
     self.colour = newColour 

    def get_colour(self): 
     return self.colour 

    def __str__(self): 
     return self.get_name() + ' : ' + self.colour 

class Pig(Animal): 
    def __init__(self, name, colour, tailType): 
     super().__init__() 
     self.tailType = tailType 

當我初始化的「豬」類,我不知道哪些參數放在__init__定義;應該是namecolourname + colour + tailType

另外,這個子類繼承了Animal的__str__表示方法,還是我必須在「Pig」子類中再次編寫它?

我真的不確定哪些參數去哪裏,當我初始化一個子類。我看了一些例子,它們都有一個非常簡單的例子(self)。

如果我嘗試做

john = Pig('John', 'pink', 'curly')

我得到

TypeError: __init__() missing 2 required positional arguments: 'name' and 'colour'

超類和子類在概念上是有意義的,但是當涉及到處理它們的語法時,我真的很掙扎。

請注意:請不要向我介紹什麼是超類構造函數的一般解釋:我已經閱讀了很多,並且還不知道如何在這種情況下應用它們。

+3

問題不在於孩子類的參數,而在於*你沒有將它們傳遞給*。 'super().__ init __(put,them,here)'。請注意,它在回溯中向您顯示此特定線路是有原因的。另外請注意,你不應該用Python編寫getter和setter。 – jonrsharpe

+0

無論使用哪個參數,都可以傳遞超類構造函數。 – user2357112

+0

當'__init__'使用'super'時需要非常小心。當你從'Pig .__ init__'中調用'super().__ init(name,color)'時,你無法知道MRO中的下一個類是否真的需要參數來定義'__init__'。 – chepner

回答

2

只要通過namecoulour

class Pig(Animal): 
    def __init__(self, name, colour, tailType): 
     super().__init__(name, colour) 
     self.tailType = tailType 

把它看成是super()提供我從父方法,綁定到我的對象。它作爲輸入是什麼? namecolour?讓我們通過它namecolour,然後。

是的,__str__像其他任何方法一樣被繼承。

+0

所以,我正確地認爲'def __init __()'部分將所有與「Pig」和「super() .__ init __()'部分接受你想從父類傳遞下來的參數? 如果我創建了一個「動物」,然後想讓它成爲「豬」,會發生什麼?有沒有簡單的方法來做到這一點? – alexqwx

+0

對,除了你的意思是把**傳遞給**(不是來自)父類。 –

+0

我不知道任何簡單的方法來鑄造你的動物作爲豬。你必須手動完成。您可以在Pig中添加一個類方法,以從Animal實例和tailType創建一個Pig實例。 –