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

单元测试出现unbound method __init__()错误,正常执行无此问题

Python2.7单元测试中继承类初始化报错排查

错误栈信息

DataBaseStorage.__init__(
>         self, key=key, sz=sz,
        )
E       TypeError: unbound method __init__() must be called with DataBaseStorage instance as first argument (got BaseStorage instance instead)

path/to/file/DataBase.py:80: TypeError

上层调用关联信息:

# This is referring to a call to DerivedStorage.__init__
path/to/file/Base.py:213: in __init__

问题背景

相同代码路径在Python3+环境下正常执行,但在Python2.7环境的单元测试中触发上述错误。当前代码继承结构设计存在缺陷(暂无法修改),核心骨架如下:

class DerivedStorage(DataBaseStorage):
  def __init__(self, key, sz):
    # 自定义逻辑
    DataBaseStorage.__init__(self, key, sz)

class BaseStorage(DerivedStorage):
  def __init__(self, key, sz):
    # 自定义逻辑
    DerivedStorage.__init__(self, key=key, sz=sz)
    # 其他逻辑

单元测试触发崩溃的代码:

bsto = BaseStorage(
    key=key,
    sz=10,
)

可能的原因分析

  1. Python2与Python3的类模型差异
    Python2中存在旧式类(未显式继承object)和新式类的区别。如果DataBaseStorage是旧式类,其__init__方法属于未绑定方法,调用时要求第一个参数必须是DataBaseStorage的直接实例。而BaseStorage是DerivedStorage的子类,在Python2的旧式类机制下,实例类型检查更严格,导致BaseStorage实例无法被识别为DataBaseStorage的有效实例。Python3中所有类默认都是新式类,方法绑定规则更灵活,允许子类实例作为父类方法的self参数,因此不会报错。

  2. 反常规继承结构的MRO问题
    当前代码的继承链是BaseStorage -> DerivedStorage -> DataBaseStorage,这与常规的“基类->子类”继承逻辑相反。Python2的旧式类MRO(方法解析顺序)是深度优先且不处理复杂继承场景,这种反向继承可能导致类实例的类型识别出现异常,进而触发参数类型检查失败。

  3. 单元测试环境的特殊干扰
    单元测试框架可能存在类重载、mock或模块加载顺序的问题,导致DataBaseStorage的类定义在测试环境中被重复加载,或者继承链的初始化逻辑被干扰,使得BaseStorage实例的类型信息出现偏差,无法通过DataBaseStorage.__init__的参数检查。

  4. 显式调用父类构造方法的写法问题
    Python2中推荐使用super(当前类, self).__init__(...)的方式调用父类构造方法,这种写法会遵循MRO正确处理继承关系。而直接使用父类.__init__(self, ...)的硬编码方式,在复杂继承链下容易出现类型不匹配问题,尤其是在Python2的旧式类环境中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:22:25