You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:48:00