Python:__init__ 中的继承和默认值

lim*_*to0 4 python inheritance default init

我正在尝试使用泛型__init__值创建一个类,但其子类具有默认值,如下所示:

class Enemy:

 def __init__(self, difficulty, power, MaxHP, magic, MaxMP, speed, name):
    self.power = power + 2*difficulty
    self.HP = self.MaxHP = MaxHP + 5*difficulty
    self.magic = magic + 2* difficulty
    self.MP = self.MaxMP = MaxMP + 5*difficulty
class Goblin(Enemy):
 def __init_(self, difficulty = 1, power = 1, MaxHP = 5, magic = 1, MaxMP = 5, speed = 5, name = "Goblin"):
    super(Goblin, self).__init__(self, power, MaxHP, magic, MaxMP, speed, name)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试创建一个没有全部默认值的 Goblin 对象时(例如,我将只输入一个难度值),它告诉我我需要完整的 8 个参数,即使其余参数已给出默认值。有什么理由我不能这样做还是我在这里做错了什么?

wim*_*wim 5

因为你super(Goblin, self).__init__(self, power, MaxHP, magic, MaxMP, speed, name)没有打电话difficulty。如果您使用的是 2.x,您可能还想继承 likeclass Enemy(object)以确保Enemy是一个新式类(考虑到您使用的旧方式,我猜您一定是这样super)。

这是一个更简单的例子:

class Animal(object):
  def __init__(self, talk):
    print '__init__ Animal: ', talk

class Cat(Animal):
  def __init__(self, talk='meow'):
    print '__init__ Cat'
    super(Cat, self).__init__(talk)

if __name__ == '__main__':
  tom = Cat()
Run Code Online (Sandbox Code Playgroud)

输出:

__init__ Cat
__init__ Animal:  meow
Run Code Online (Sandbox Code Playgroud)

编辑:

好吧,如果以下方法不起作用,也许您的解释器中缓存了旧的类定义(尝试在新的解释器上运行它)。

class Enemy(object):
  def __init__(self, difficulty, power, MaxHP, magic, MaxMP, speed, name):
    self.power = power + 2*difficulty
    self.HP = self.MaxHP = MaxHP + 5*difficulty
    self.magic = magic + 2* difficulty
    self.MP = self.MaxMP = MaxMP + 5*difficulty
    print 'Raaarghh!! I am the formidable {}.'.format(name)

class Goblin(Enemy):
  def __init__(self, difficulty=1, power=1, MaxHP=5, magic=1, MaxMP=5, speed=5, name="Goblin"):
    super(Goblin, self).__init__(difficulty, power, MaxHP, magic, MaxMP, speed, name)

if __name__ == '__main__':
  g = Goblin(name='user1038783 goblin')
Run Code Online (Sandbox Code Playgroud)