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没有作用到实际被使用的类上,主要有两个可能:
- 类名拼写错误:代码里的类是
AnalyseMyHandFlop,但测试里Mock的是AnalyseMyHandOnFlop(多了个On),相当于Mock了一个不存在的类,完全没影响到实际代码。 - 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是替换指定模块中的引用,而不是原类本身。
具体修复步骤
- 修正类名拼写:把测试里的
AnalyseMyHandOnFlop改成AnalyseMyHandFlop,确保Mock的是正确的类。 - 修复继承类的构造方法:在
AnalyseMyHandFlop的__init__开头添加super().__init__(...),确保父类的__init__被执行,初始化self.flop1。 - 调整Patch路径:确认
AnalyseMyHandTurn实际使用的AnalyseMyHandFlop引用路径,用这个路径来做Mock。
内容的提问来源于stack exchange,提问作者dzdsds
相关产品推荐
相关产品推荐

