2016-04-28 71 views
1

我需要創建一個UNBOUND方法調用Plant以設置名稱和葉子,我不知道如何。任何幫助表示讚賞。如何在子類中調用父類?

我的代碼:分配的

class Plant(object): 
    def __init__(self, name : str, leaves : int): 
     self.plant_name = name 
     self.leaves = leaves 
    def __str__(self): 
     return "{} {}".format(self.plant_name, self.leaves) 
    def __eq__(self, plant1): 
     if self.leaves == plant1.leaves: 
      return self.leaves 
    def __It__(self, plant1): 
     if self.leaves < plant1.leaves: 
      print ("{} has more leaves than {}".format(plant1.plant_name, self.plant_name)) 
      return self.leaves < plant1.leaves 
     elif self.leaves > plant1.leaves: 
      print ("{} has more leaves than {}".format(self.plant_name, plant1.plant_name)) 
      return self.leaves < plant1.leaves 

class Flower(Plant): 
    def __init__(self, color : str, petals : int): 
     self.color = color 
     self.petals = petals 

    def pick_petal(self.petals) 
     self.petals += 1 

精確用詞:

創建一個名爲花新類。花卉是從植物課上分類的;所以除了名字和葉子,它增加了2個新的屬性;顏色,花瓣。顏色是包含花朵顏色的字符串,而花瓣是具有花朵上花瓣數量的整數。您應該能夠創建一個init方法來設置實例。使用init,您應該創建一個UNBOUND方法調用來設置名稱和葉子。另外,創建一個名爲pick_petal的方法來減少花朵上的花瓣數量。

+1

「UNBOUND方法調用工廠」? – user2864740

+1

是什麼讓你覺得你需要一個未綁定的電話?你幾乎肯定不會。 –

+0

這是我正在進行的任務的一項要求。這是我唯一不瞭解的部分。 –

回答

3

「未綁定的方法調用」表示您正在調用類的方法而不是類的實例。這意味着像Plant.some_method

在這種情況下唯一有意義的未綁定調用是調用基類的__init__方法。這似乎滿足了「設置姓名和離開」的要求,並且在過去是進行繼承的常用方式。

它看起來像這樣:

class Flower(Plant): 
    def __init__(self, name, leaves, color, petals): 
     Plant.__init__(self, ...) 
     ... 

你需要在適當的參數傳遞給__init__。第一個是self,其餘的由基類中的Plant.__init__定義。你還需要修改參數列表的語法,因爲`color:str'不是有效的python。


注:一般來說,一個更好的解決方法是調用super,而不是做對__init__父類未綁定的方法調用。不過,我不確定你能用這個建議來做什麼。也許教練讓你在學習新方法之前先以舊方式繼承?

對於此作業,您應該使用Plant.__init__(...),因爲這是作業顯式要求您執行的操作。您可以跟隨教練詢問super

+1

它可能應該是'def __init __(self,name:str,leaves:int,color:str,petals:int):' –

+0

@PauloScardine:你是對的。我原先留下的代碼寫在問題中,但經過進一步的思考,我決定採納你的建議。感謝您的反饋。 –

1

布賴恩的答案很完美。剛剛完成的緣故:

# Looks like the assignment asks for this 
class Flower(Plant): 
    def __init__(self, name, leaves, color, petals): 
     # call __init__ from parent so you don't repeat code already there 
     Plant.__init__(self, name, leaves) 
     self.color = color 
     self.petals = petals 

這是「經典」,「非合作」的繼承風格就出來了時尚的很久以前(近15年的2016),因爲它打破多重繼承。有關參考,請參閱BDFL發佈的文章「Unifying types and classes in Python 2.2」。起初,我認爲這可能是一個非常古老的任務,但我看到該作業使用「新風格」繼承(繼承於object是Python 2中新風格的簽名,因爲默認是舊風格,在Python 3只有新風格)。爲了使多重繼承工作,而不是調用父類明確(中Plant.__init__語句),我們使用super功能像這樣在Python 2:

 super(Flower, self).__init__(name, leaves) 

或者只是這條巨蟒後3(PEP後0367要準確):

 super().__init__(name, leaves) 

即使在Python 3繼承的新型是默認的,你仍然鼓勵從object明確繼承。

+0

這不僅僅是一個答案,它只是作爲答案發布,因爲評論系統太長了。 –