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

Python 将类和实例变量混合在一起,python,class,variables,python-3.x,instance,Python,Class,Variables,Python 3.x,Instance,我正在设计一个简单的角色扮演游戏(类似于魔兽世界、传奇联盟等),你基本上有一个英雄或一个与野生动物和其他英雄/冠军战斗的冠军。 这个英雄可以通过从战斗中获得经验值来升级,每个等级都会授予他一个技能点,这允许他升级他的一项技能。 每项技能都有自己的目的,做自己的事情,例如: class DamageAura(Skill): """ This skill increases damage dealt by your hero, as well as deals damage

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

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
)实例的属性,而不是类变量。 有没有一个简单但安全的方法来合并这两个? 基本上,类变量将定义英雄的默认值,但是如果我想用自定义名称创建一个
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的情况下完成此操作。

您可以允许最终用户将其
英雄定义创建为字典:

my_hero = dict(name='Warrior'.
               description='Ancient Warrior is thirsty for blood.',
               maximum_level=30,
               ...)
然后,您可以轻松创建如下实例:

hero = Hero(**my_hero)
(如果语法不熟悉,请参阅)

对于
DamageAura
Warrior
,它们似乎比
Skill
Hero
的子类更适合作为实例



另一方面,考虑让用户在代码之外创建字符(例如,在JSON、XML、YAML……),然后解析文件并从输入数据创建适当的实例。

不确定您是否暗示了这一点,但是<代码>它非常常用。所以,你打算让玩家通过编写代码来创建自定义英雄类,对吗?如果是这样,为什么?请注意,在Python中嵌套类很少是一个好主意。@Kevin是的,如果我不必担心子类或创建的难易性,类就是这样的。然而,它完全放弃了使用“易于创建”版本的可能性,在该版本中,我在类级别定义变量(我最初问题的第一段代码)。@PieterWitvoet从技术上讲,不是玩家,而是服务器主机。我希望每个服务器都能决定自己的英雄是什么样的,这样可能会有数千个不同技能的英雄。阅读我的编辑,我很确定这些类应该是类,而不是实例。对不起,一开始就忘了提。我将如何使用您的方法实现这些技能?他们需要链接到英雄,而且英雄应该在技能之前定义。@MarkusMeskanen但是没有理由每个玩家都不能拥有自己的
英雄
实例而不进行子类化-只需从
战士
规范中创建四个
英雄
实例。啊,我现在看到了。。。谢谢,我想我会用你的方法!