我只是想整理一個簡單的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)
您可能希望查找組合而不是使用繼承。或者我認爲你可以使用一個類工廠。 – M4rtini
你可以使用['type()'](https://docs.python.org/3/library/functions.html?highlight=type#type)創建任意基類的新任意類型(例如'type(' NewChar',(精靈,戰士,...),{})')。不過,我同意@ M4rtini:對於這類東西(尤其是當事情開始變得複雜時),組合更好。 –