2016-01-15 46 views
0

我只是想整理一個簡單的RPG示例,以便學習Python中的OOP。Python多重繼承(RPG示例)

我創建了一個基類CharRace(object)。然後我創建了兩個派生類,Elf(CharRace)和Dwarf(CharRace)。另外,我有第二個基類CharClass(object),它有兩個派生類:Wizard(CharClass)和Warrior(CharClass)。

我希望能夠做的是創建一個名爲NewChar的新類,我可以傳遞一個名稱,一個種族和一個類,它將創建適當的對象,繼承所有的屬性比賽和班級。

例如,我想創建NewChar的一個類的實例像這樣的東西: PLAYER1 = NewChar( 「鮑勃」,精靈,精靈) Player2 = NewChar( 「菲爾」,矮人,戰士)

我確定有一個聰明/正確/可擴展的方式來做到這一點,或者我的班級應該組織不同,但我很難找到它。任何幫助或建議表示讚賞!

class CharRace(object): 
    'race for all characters' 
    health = 0 
    mana = 0 
    race = "" 
    name = "" 
    def __init__(self, health, mana, race, name): 
     self.health = health 
     self.mana = mana 
     self.race = race 
     self.name = name 
     print ("self = ",self) 
    def decreaseHealth (self, amount): 
     self.health = self.health - amount 
     print ("Decreased health to: ", self.health) 
     if (self.health) <= 0: 
      print (self.name, "has died!!!") 
    def increaseHealth (self, amount): 
     self.health = self.health + amount 
     print ("Increased health to: ", self.health) 
    def printStats(self): 
     print() 
     print("Stats for",self.name) 
     print (" Race =",self.race) 
     print (" Health =",self.health) 
     print (" Mana =",self.mana) 
     CharClass.printStats(self) 
    def __str__(self): 
     return (self.name) 

class CharClass(object): 
    'class for all characters' 
    weapon = "" 
    armor = 0 
    def __init__(self, weapon, armor, classname): 
     self.weapon = weapon 
     self.armor = armor 
     self.classname = classname 
     print ("self = ",self) 
    def printStats(self): 
     print (" Weapon =",self.weapon) 
     print (" Armor =",self.armor) 

# Character Classes 
class Warrior(CharClass): 
    'warrior class' 
    weapon = "Sword" 
    armor = 200 
    classname = "Warrior" 
    def __init__(self): 
     CharClass.__init__(self, self.weapon, self.armor, self.classname) 

class Wizard(CharClass): 
    'wizard class' 
    weapon = "Wand" 
    armor = 100 
    classname = "Wizard" 
    def __init__(self): 
     CharClass.__init__(self, self.weapon, self.armor, self.classname) 

# Character Races 
class Elf(CharRace): 
    'Elf subclass' 
    health = 100 
    mana = 200 
    race = "Elf" 
    def __init__(self, name): 
     CharRace.__init__(self, self.health, self.mana, self.race, name) 

class Dwarf(CharRace): 
    'Dwarf subclass' 
    health = 200 
    mana = 100 
    race = "Dwarf" 
    def __init__(self, name): 
     CharRace.__init__(self, self.health, self.mana, self.race, name) 


# This is not an efficient or scalable way to do this.... 
class ElfWarrior(Elf,Warrior): 
    'New character creation' 
    def __init__(self, name): 
     Elf.__init__(self, name) 
     Warrior.__init__(self) 

class ElfWizard(Elf,Wizard): 
    'New character creation' 
    def __init__(self, name): 
     Elf.__init__(self, name) 
     Wizard.__init__(self) 

class DwarfWarrior(Dwarf,Warrior): 
    'New character creation' 
    def __init__(self, name): 
     Dwarf.__init__(self, name) 
     Warrior.__init__(self) 

class DwarfWizard(Dwarf,Wizard): 
    'New character creation' 
    def __init__(self, name): 
     Dwarf.__init__(self, name) 
     Wizard.__init__(self) 
+3

您可能希望查找組合而不是使用繼承。或者我認爲你可以使用一個類工廠。 – M4rtini

+0

你可以使用['type()'](https://docs.python.org/3/library/functions.html?highlight=type#type)創建任意基類的新任意類型(例如'type(' NewChar',(精靈,戰士,...),{})')。不過,我同意@ M4rtini:對於這類東西(尤其是當事情開始變得複雜時),組合更好。 –

回答

0

我想什麼,能夠做的就是創建一個名爲NewChar新的類,我可以通過一個名字,一個種族,一個類,它會創建一個繼承合適的對象種族和階級的所有屬性。

如果你真的想用這種方法,你可以嘗試這樣的事:

def create_character(race, class, name): 
    type_name = race.__name__ + class.__name__ 
    return type(type_name, (race, class), {'name'=name} 

Here是類型功能商量好了,和元類,您可以使用微調這更進一步。

這就是說,這真的不是最好的方法。喜歡構成繼承。如果你的角色改變了課程,或者你想要雙重課程?

你可以嘗試這樣的事情,而不是:

class Character(object): 

    def __init__(name, race, class): 
     self.name = name 
     self.race = race.race 
     #etc 

    def increase_health(amount): 
     self.race.increase_health(amount) 

檢查出書設計模式:可複用面向對象軟件Head First設計模式的元素,以瞭解更多信息。

+0

感謝您的建議!我現在試圖讓作文成爲可能。兩個問題:1)我認爲上面定義的Character類中仍然存在混淆的是,爲什麼我需要從基類中分配所有屬性?這不就是__init__函數的重點嗎? 2)沒有任何基類方法在Character類上工作(例如,y = Character(Elf,Wizard,「Bob」),y.increaseHealth(10))。這不是基類的要點,任何子類繼承他們所有的方法? – Rhinopotamus

+0

1)我犯了一個愚蠢的錯字。你是對的,你不應該重新分配所有的屬性。 2)。這是現在的組合,而不是繼承,所以你確實失去了一些便利。你必須定義函數來調用成員的函數。請參閱編輯以進行澄清。 – JETM