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

Python继承Mock场景下出现AttributeError:子类无法访问父类属性flop1

Python继承与Mock测试问题解析

代码结构

class Flop_helper(): 
    def __init__(...): 
        self.flop1 = [...]

class AnalyseMyHandFlop(Flop_helper): 
    def __init__(...): 
        self.flop1_nums = [card[0] for card in self.flop1]

class AnalyseMyHandTurn(AnalyseMyHandFlop): 
    # ... 省略实现

单元测试代码

@mock.patch('some_path.FlopHelper')
@mock.patch('some_path.AnalyseMyHandOnFlop')
def test_function(mock_AnalyseMyHandOnFlop, mockFlopHelper):
    amhot = AnalyseMyHandOnTurn(...)

报错信息

self.flop1_nums = [card[0] for card in self.flop1]
E       AttributeError: 'AnalyseMyHandOnTurn' object has no attribute 'flop1'

困惑点

  • AnalyseMyHandOnTurn继承自AnalyseMyHandFlop,为什么会没有flop1属性?
  • 已经Mock了AnalyseMyHandOnFlop类,为什么还会触发这个错误?

问题原因与解决办法

关于困惑1:为什么没有flop1属性

flop1是在Flop_helper的__init__方法中初始化的,但如果AnalyseMyHandFlop的__init__没有调用父类的构造方法(比如super().__init__(...)),那么当实例化AnalyseMyHandTurn时,Flop_helper的__init__不会被自动执行,自然不会初始化self.flop1。即使不做Mock,正常运行代码也会出现这个问题。

关于困惑2:Mock没生效的原因

核心问题是Mock没有作用到实际被使用的类上,主要有两个可能:

  1. 类名拼写错误:代码里的类是AnalyseMyHandFlop,但测试里Mock的是AnalyseMyHandOnFlop(多了个On),相当于Mock了一个不存在的类,完全没影响到实际代码。
  2. Patch路径错误:Mock的路径必须是AnalyseMyHandTurn所在模块中导入AnalyseMyHandFlop的路径,而不是原类的定义路径。比如,如果你的测试文件里是from my_module import AnalyseMyHandTurn,而my_module里是from some_path import AnalyseMyHandFlop,那你需要Patch的是my_module.AnalyseMyHandFlop,而不是some_path.AnalyseMyHandFlop——因为Python的Mock是替换指定模块中的引用,而不是原类本身。

具体修复步骤

  1. 修正类名拼写:把测试里的AnalyseMyHandOnFlop改成AnalyseMyHandFlop,确保Mock的是正确的类。
  2. 修复继承类的构造方法:在AnalyseMyHandFlop的__init__开头添加super().__init__(...),确保父类的__init__被执行,初始化self.flop1。
  3. 调整Patch路径:确认AnalyseMyHandTurn实际使用的AnalyseMyHandFlop引用路径,用这个路径来做Mock。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 10:07:39