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

Python多层继承类实例化__init__()报位置参数错误排查修复

错误根因

这个参数不匹配的报错,本质是继承链上中间类的构造方法设计错误,构造调用逻辑没有对齐:

  • 类的继承顺序是DynamicalModel → AnalyticalModel → UnicycleDynamics4dSymbolic,按照Python的方法解析规则,UnicycleDynamics4dSymbolic里写的super().__init__()会优先调用直接父类AnalyticalModel的__init__,不会直接跳级调用顶层的DynamicalModel。
  • 你定义的AnalyticalModel.__init__签名是def __init__(self, A_num, B_num),算上自动传入的self,一共只接受3个位置参数。
  • 你在子类里调用super().__init__(4, 2, dt, *args, **kwargs)时,实际给AnalyticalModel.__init__传了self、4、2、dt共4个位置参数,超出了它定义的参数数量,直接触发了这个TypeError。
  • 除此之外AnalyticalModel还有一个隐藏bug:它重写__init__时完全没有调用父类DynamicalModel的构造方法,就算你把参数数量改对,n_x、n_u、dt、NX_EYE这些顶层类定义的实例属性根本不会被初始化,后续调用动力学、线性化相关方法时会抛出属性不存在的错误。
修复方法

修改中间类AnalyticalModel的__init__方法,对齐参数传递规则,补全父类构造调用:

class AnalyticalModel(DynamicalModel):
    """Mix-in for analytical linearization"""

    def __init__(self, n_x, n_u, dt, id=None, A_num=None, B_num=None):
        # 先调用顶层父类构造,初始化基础动力学参数
        super().__init__(n_x, n_u, dt, id)
        # 初始化当前类的线性化矩阵属性
        self.A_num = A_num
        self.B_num = B_num

    def f(self, x, u):
        return self._f(x, u)

    def linearize(self, x, u):
        return self.A_num(x, u), self.B_num(x, u)

你现有的UnicycleDynamics4dSymbolic类代码不需要做任何调整:它本身给super().__init__传4, 2, dt的逻辑完全适配修改后的父类签名,后续通过sympy生成的_f、A_num、B_num会直接覆盖父类初始化时的默认None值,不会有冲突。

修复后执行流程

当你调用dec.UnicycleDynamics4dSymbolic(dt)实例化对象时:

  1. 进入UnicycleDynamics4dSymbolic.__init__,调用父类AnalyticalModel.__init__,传入参数4、2、dt,参数数量完全匹配
  2. AnalyticalModel.__init__内部调用DynamicalModel.__init__,完成n_x、n_u、dt、id、NX_EYE这些基础属性的初始化
  3. 回到UnicycleDynamics4dSymbolic.__init__继续执行符号推导逻辑,将lambdify生成的数值计算函数赋值给实例属性,整个流程不会再报错。

补充说明:之所以把A_num、B_num设为默认值为None的可选参数,是因为你的子类逻辑是先调用父类构造,再自行生成这两个线性化矩阵函数赋值给实例,不需要在构造父类时就传入这两个值,设为可选参数可以避免参数顺序冲突。

内容的提问来源于stack exchange,提问作者Randy Chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:03:24