我正在使用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")
但是现在的缺点是您必须指定weapon
weapon="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