Python pygame中继承父类的__init__()方法报TypeError如何解决?
报错原因
- 子类
Knight的构造方法__init__仅定义了self一个入参,但实例化Knight时传入了5个参数,参数数量不匹配直接触发类型错误。 - 子类
__init__内部调用父类构造方法时,只传入了self,没有传递父类要求的img、hitbox、vel、pos_x、pos_y5个必填参数,即使实例化传参正确,此处也会触发参数不匹配错误。
额外隐含问题:父类初始化的坐标属性为pos_x、pos_y,但move方法中调用的是self.x,会触发属性不存在的报错,需要统一属性命名。
解决方法
方法1:参数透传(无独有初始化逻辑时首选)
不需要手动罗列父类参数,直接用可变参数接收所有入参传递给父类,代码更简洁,后续父类参数修改也不需要同步调整子类:
class Knight(Character): def __init__(self, *args, **kwargs): # super()会自动指向父类,无需显式写父类名 super().__init__(*args, **kwargs) def move(self): # 统一使用父类定义的pos_x属性 if self.right: if self.pos_x + self.vel < win_width: self.pos_x += self.vel if self.left: if self.pos_x - self.vel > 0: self.pos_x -= self.vel
方法2:显式声明参数(需添加子类独有属性时使用)
如果后续需要给Knight添加独有的初始化参数,可以显式声明所有入参,先传递父类参数再初始化子类独有属性:
class Knight(Character): # 前5个是父类要求的参数,最后一个是子类独有参数示例 def __init__(self, img, hitbox, vel, pos_x, pos_y, hp=100): super().__init__(img, hitbox, vel, pos_x, pos_y) # 初始化子类独有属性 self.hp = hp def move(self): # 同上调整属性名即可 if self.right: if self.pos_x + self.vel < win_width: self.pos_x += self.vel if self.left: if self.pos_x - self.vel > 0: self.pos_x -= self.vel
内容的提问来源于stack exchange,提问作者YellowBannanaRBX
相关产品推荐
相关产品推荐

