什么时候一个类可以保证一个子类?

2024-04-29 14:13:56 发布

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

例如,我正在尝试为一个简单的游戏构建一个敌人类。每一个产生的敌人都有一个类型影响它的属性,这些属性是敌人类中的字段。你知道吗

class Enemy:
    #Base Stats for all enemies
    name = "foo"
    current_health = 4
    max_health = 4
    attack = 0
    defense = 0
    armor = 0
    initiative = 0
    initMod = 0
    alive = True

每个类型是否应该是敌人子类。。你知道吗

class goblin(Enemy):
    name = goblin;
    current_health = 8
    max_health = 8
    attack = 3
    defense = 2
    armor = 0

    def attack(){
        //goblin-specific attack
    }

但是这个方法意味着我必须为每个类型构建一个类(80+个类),或者有更好的方法吗?这个敌人将会随机化,所以我想类型也可以放入一个字典,它使用类型的名称作为关键字。尽管我不完全确定如何实现这一点。你知道吗


Tags: 方法name游戏类型属性currentmaxclass
3条回答

如果每个敌人类型的属性集和可能的操作在不同类型中都很常见,那么我认为没有理由比为该类型定义一个80项枚举并使用一个名为Enemy的类更复杂。你知道吗

如果您确实需要各种各样的操作,那么您可以将80个类型分组到具有公共属性的各种集合中(例如FlyingEnemyUndeadEnemy,等等)。这些将成为你的子类。你知道吗

如果您想走字典路线,您可以这样做,通过键返回一个元组:

enemy_types = {"goblin": ("goblin", 8, 8, 3, 2, 0, goblin_attack)}

def goblin_attack(enemy):
    do_stuff()

尽管您可能希望使用命名的\u元组

https://stackoverflow.com/a/13700868/2489837

以确保不会混淆元组中的字段

地精应该是敌人的一个例子。但是,在您的示例中添加了一个名为attack的方法。我想说最好的方法是:

class Enemy:
   #Base Stats for all enemies
  def __init__ (self, **kwargs):
   self.name = "foo"
   self.current_health = 4
   self.max_health = 4
   self.attack = 0
   self.defense = 0
   self.armor = 0
   self.initiative = 0
   self.initMod = 0
   self.alive = True
   # Use this to specify any other parameters you may need
   for key in kwargs:
       exec ("self.%s = %s" % (key, kwargs[key])

现在可以创建名为goblin的Enemy实例。你知道吗

为了回答您最初提出的何时使用子类的问题,我想说使用子类是很好的,但是在您的情况下可能会使事情过于复杂。由于您的子类中只有一个方法,您可以轻松地创建一个模块,然后在__init__中有一个参数来指定attack函数。这将更简化您的代码。你知道吗

Note: If you are going to use subclasses make sure that in the __init__ of your subclass you call the __init__ of your baseclass with super().

相关问题 更多 >