Python多重继承(RPG示例)

2024-05-23 18:18:46 发布

您现在位置:Python中文网/ 问答频道 /正文

为了学习Python中的OOP,我只想把一个简单的RPG示例放在一起。在

我创建了一个基类CharRace(object)。然后我创建了两个派生类,Elf(CharRace)和Dwarf(CharRace)。另外,我还有第二个基类CharClass(object),有两个派生类:Wizard(CharClass)和Warrior(CharClass)。在

我希望能够创建一个名为NewChar的新类,我可以传递一个名称、一个race和一个类,它将创建一个适当的对象,继承race和类的所有属性。在

例如,我想创建一个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)

Tags: nameselfinitdefclassarmorprintmana
1条回答
网友
1楼 · 发布于 2024-05-23 18:18:46

What I'd like to be able to do is create a new class called NewChar, that I can pass a name, a race, and a class, and it will create the appropriate object that inherits all the properties of both the race and the class.

如果您真的想使用这种方法,您可以尝试如下方法:

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

Here是关于类型函数和元类的一个很好的讨论,您可以使用它们来进一步微调。在

这不是最好的办法。喜欢组合而不是继承。如果你的角色换了职业,或者你想双重职业呢?在

你可以试试这样的方法:

^{pr2}$

请参阅《设计模式:可重用面向对象软件的元素》一书或《Head-First Design Patterns了解更多信息。在

相关问题 更多 >