2017-03-19 63 views
2

給予代碼:關於繼承和超()

class Character(): 
    def __init__(self, name): 
     self.name = name 
     self.health = 50 
     self.damage = 10 

class Warrior(Character): 
    def __init__(self, name, weapon, armor): 
     super(Character).__init__() 
     self.weapon = weapon 
     self.armor = armor 
     self.strength = 10 
     self.dexterity = 5 
     self.intelligence = 5 

Doug = Character("Doug") 
Mark = Warrior("Mark", "Axe", None) 

爲什麼不Warrior類繼承自Characterhealth
我需要做些什麼才能打印Mark.health

+0

'超'是相當棘手的幾個原因;請參閱http://stackoverflow.com/q/222877/1256452 – torek

回答

4

您錯誤地使用了super();不要自行通過Character。在Python 3,不要在所有通過任何東西,但通過name__init__

class Warrior(Character): 
    def __init__(self, name, weapon, armor): 
     super().__init__(name) 
     self.weapon = weapon 
     self.armor = armor 
     self.strength = 10 
     self.dexterity = 5 
     self.intelligence = 5 

現在的屬性設置正確,包括healthdamage

>>> Mark = Warrior("Mark", "Axe", None) 
>>> vars(Mark) 
{'name': 'Mark', 'health': 50, 'damage': 10, 'weapon': 'Axe', 'armor': None, 'strength': 10, 'dexterity': 5, 'intelligence': 5} 

在幕後,super(Character).__init__()最後調用super.__init__()方法,該方法在一個類的方法中恰好工作,但不會產生任何實際用途(返回None)。

+0

謝謝,我一直無法理解超級概念,使得像這樣的小程序可以練習。您的評論有助於澄清一些誤解。 – Matt

+0

如果Character類需要更多的參數,而不僅僅是'name',我需要將它們傳遞給__init__嗎? – Matt

+0

@Matt:是的,因爲'Character .__ init__'方法需要更多的參數。 –