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

如何在Python 3.x中用pytest MonkeyPatch被继承的混入类

解决pytest中对被继承混入类的MonkeyPatch问题

针对你遇到的场景,有两种可靠的解决方式:

方式一:直接修改父类A的目标方法

因为B的foo方法是继承自A,直接patch A类的foo方法,会让所有继承A的子类(包括B)自动使用修改后的方法。

示例代码:

def test_B(monkeypatch):
    def mock_foo(cls) -> str:
        return 'bar'
    # 直接替换A类的foo类方法
    monkeypatch.setattr(A, 'foo', classmethod(mock_foo))
    
    # 验证效果
    assert B.foo() == 'bar'

方式二:修改子类B的继承基类

如果你需要完全替换A类的行为而非单个方法,可以修改B的__bases__属性,将原父类A替换为你的MockA。

示例代码:

def test_B(monkeypatch):
    class MockA:
        @classmethod
        def foo(cls) -> str:
            return 'bar'
    
    # 将B的基类从A替换为MockA
    monkeypatch.setattr(B, '__bases__', (MockA,))
    
    # 验证效果
    assert B.foo() == 'bar'

原方法无效的原因说明

  • 直接patch B.foo时,若B未显式定义foo,Python会优先从父类A查找该方法;如果你的patch路径(如字符串'B.foo')不正确,或者未显式在B上覆盖该方法,就不会生效。
  • 替换整个A类时,B的继承关系在类定义时就已确定(绑定了原A的引用),后续替换全局的A变量不会改变B已有的继承链,因此B仍会使用原A的方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:48:25