将类和实例变量混合在一起

时间:2014-12-15 14:55:51

标签: python class variables python-3.x instance

我正在设计一个简单的角色扮演游戏(类似于魔兽世界,英雄联盟等),你基本上拥有一个与野生生物和其他英雄/冠军战斗的英雄或冠军。 然后这个英雄可以通过从战斗中获得经验值来升级,并且每个级别都会授予他技能点,这使他能够提升他的一项技能。 每种技能都有自己的目的并做自己的事情,技能的一个例子是:

class DamageAura(Skill):
    """
    This skill increases damage dealt by your hero,
    as well as deals damage back to the ones who attack your hero.
    """

    name = 'Damage Aura'
    description = '...'

    # These methods are called when the actual event happens in game

    def unit_attack(self, target, damage):  
        target._health -= (self.level / 100) * damage

    def unit_defend(self, attacker, damage):
        attacker.deal_damage((self.level / 100) * damage)

现在我希望游戏中的玩家能够制作自己的英雄,而且需要它很简单。 问题是,我不想做"坏"代码只是为了让创建英雄更容易。 这是英雄级理想上的样子:

class Warrior(Hero):
    name = 'Warrior'
    description = 'Ancient Warrior is thirsty for blood.'
    maximum_level = 30
    agility = 20
    intelligence = 10
    strength = 30

    class DamageAura(Skill):
        name = 'Damage Aura'
        description = '...'

        def unit_attack(...):
            ...

    class StrongerWeapons(Skill):
        name = 'Stronger Weapons'
        ...

现在的问题是,我希望name变量是实际英雄(f.e。Warrior)实例的属性,而不是类变量。 合并这两个是否有一种简单而安全的方法? 基本上类变量会定义英雄的默认值,但如果我想创建一个带有自定义名称的Warrior实例,我可以通过简单地执行warrior1 = Warrior(name='Warrior God', maximum_level=40)

来实现

如果我不必担心子类或易于创建,这就是本课的样子:

class Hero(object):
    def __init__(self, name, description='', maximum_level=50, skill_set=None, ...):
        self.name = name
        self.description = description
        self.maximum_level = maximum_level
        self.skill_set = skill_set or []
        ...

修改 我忘了提;在这种情况下,每个玩家可以扮演完全相同的英雄,战士,这就是为什么战士是一个阶级,而不仅仅是英雄的一个实例。他们都具有相同的技能组合,但具有独特的等级。

编辑2: 我对Python类或任何东西没有任何问题,通常我不会使技能嵌套类或类似的东西,但在这种情况下,我必须投入很多来轻松创建类,所以即使是" noobs"可以做到这一点,而根本不知道任何python。

1 个答案:

答案 0 :(得分:2)

您可以允许最终用户将他们的Hero定义创建为字典:

my_hero = dict(name='Warrior'.
               description='Ancient Warrior is thirsty for blood.',
               maximum_level=30,
               ...)

然后您可以轻松创建如下的实例:

hero = Hero(**my_hero)

(如果语法不熟悉,请参阅What does ** (double star) and * (star) do for parameters?

对于DamageAuraWarrior,似乎分别比SkillHero更适合作为实例而非<{1}}和{{1}}的子类。 / p>


或者,考虑让用户在代码中创建外部字符(例如,在JSON,XML,YAML等中),然后解析文件并从输入数据创建适当的实例。