Python:init中的继承和默认值__

2024-04-29 12:25:08 发布

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

我正在尝试创建一个具有泛型__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)

然而,当我试图创建一个没有全部默认值的Goblin对象时(比如,我只需要输入一个困难的值),它告诉我需要全部8个参数,即使其余的都是默认值。我不能这么做是有什么原因吗?还是我做错了什么?


Tags: nameselfinitdefmagicclass泛型hp
2条回答

因为你在没有difficulty的情况下调用了super(Goblin, self).__init__(self, power, MaxHP, magic, MaxMP, speed, name)。如果在2.x上(考虑到使用super的旧方法,我猜您一定是这样),您可能还希望像class Enemy(object)那样继承,以确保Enemy是一个新样式的类。

下面是一个简单的例子:

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()

输出:

__init__ Cat
__init__ Animal:  meow

编辑:

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

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')

此代码对我有效:

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

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)

我必须改变你的方式才能让它工作:

  1. 修正Goblin中的def __init__拼写错误。
    • 症状:Goblin()提出了TypeError: __init__() takes exactly 8 arguments (1 given),因为Goblin没有定义__init__方法,所以它从Enemy继承了没有默认值的方法
  2. 通过继承objectEnemy更改为新样式的类
    • 症状:在调用super()时,我得到了TypeError: must be type, not classobj;我不确定旧版本的Python是否允许它,或者是否触发了不同的错误,但是我知道旧样式的类与新样式的类具有不同的MRO(方法解析顺序)规则,而且我相信这无论如何都会使super变得异常。
  3. 从对super(Goblin, self).__init__(self, ...)的调用中删除第二个self
    • 症状:self被自动传递给super(Class, self).some_method(...),所以自己把它放在那里就像调用Enemy.__init__(self, self, difficulty, power, ...)
  4. 在对super(Goblin, self).__init__(...)的调用中添加了difficulty
    • 症状:您在Goblin.__init__中设置了默认值,但随后没有将值传递到Enemy.__init__

我想是因为这个。

相关问题 更多 >