继承的 __init__() 函数无法按预期工作



我正在使用Python上的pygame库开发一个游戏。我基本上定义了一个Character类,Knight类和Enemy类将从中继承函数。由于两个子类使用相同的初始化函数,因此我在父类下定义了__init__()函数。但是,我不完全了解它是如何工作的,并且出现以下错误:

TypeError: __init__() takes 1 positional argument but 3 were given

这是我的代码:

class Character():
def __init__(self, img, hitbox, vel, pos_x, pos_y):
self.img = img
self.hitbox = hitbox
self.vel = vel
self.pos_x = pos_x
self.pos_y = pos_y

def draw(self):

if self.right:
pygame.transform.flip(self.img, True, False)

win.blit(self.img, (self.pos_x, self.pos_y))
class Knight(Character):

def __init__(self):
Character.__init__(self)
def move(self):
if self.right:
if self.x + self.vel < win_width:
self.x += self.vel
if self.left:
if self.x - self.vel > 0:
self.x -= self.vel
main_plr = Knight("img", (19, 20), 5, 30, 20)

快速修复:只需从Knight中删除__init__方法。

引发此错误是因为您创建了一个具有 6 的Knight对象 参数 (self, "img", (19, 20), 5, 30, 20),而__init__方法只接受一个 (self)。

因此,如果您的Knight对象没有任何其他属性 与Character对象相比,删除__init__方法。 现在,如果你想让你的骑士拥有武器,因为 例如,您必须执行以下操作:

class Knight(Character):
def __init__(self, img, hitbox, vel, pos_x, pos_y, weapon):
super().__init__(img, hitbox, vel, pos_x, pos_y)
self.weapon = weapon
k = Knight("img", (19, 20), 5, 30, 20, "sword")

[编辑]

此外,正如@Matiiss所建议的,您可以使用*args来避免 在Knight.__init__中重复所有Character.__init__论点. 除了简洁之外,一个优点是您无需修改Knight是否向Character对象添加属性。

class Knight(Character):
def __init__(self, *args, weapon):
super().__init__(*args)
self.weapon = weapon
k = Knight("img", (19, 20), 5, 30, 20, weapon="sword")

但是现在的缺点是您必须指定weaponweapon="the-weapon",因为它现在是一个关键字参数(放置*args后)。

正如你看到的错误所说,你的Knight构造函数不接受这些参数;如果你打算使用这种继承的方法扩展,类和子类方法需要有匹配的参数签名。最好使用super()来引用超类,而不是显式命名它。

最简单的处理方法是使用*args**kwargs,简洁地将子类方法不需要的参数传递给超类方法,即

class Character():
def __init__(self, img, hitbox, vel, pos_x, pos_y):
self.img = img
self.hitbox = hitbox
self.vel = vel
self.pos_x = pos_x
self.pos_y = pos_y

class Knight(Character):

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def move(self):
if self.right:
if self.x + self.vel < win_width:
self.x += self.vel
if self.left:
if self.x - self.vel > 0:
self.x -= self.vel

相关内容

  • 没有找到相关文章

最新更新