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

类__init__内创建的对象方法Mock失败,报错AttributeError求解答

问题分析:AttributeError: 'A' object has no attribute '_A__db_obj'

原代码(类A)

import DBClass

class A:
    def __init__:
        self.__db_obj = DBClass()

    def func1():
        data = self.__db.obj.func2()
        return data

类A通过__init__创建DBClass的私有实例__db_obj,func1调用该实例的func2方法获取数据。

测试代码

def test_func1:
    mocker.patch("temp.A.__init__", return_value=None)
    mocker.patch("temp.DBClass.func2", return_value={'data1': key1})
    response = A().func1()
    assert response == {'data1': key1}通常Re这.restacten提供 sizeOriginal                Garden中等以下内容:

运行错误

AttributeError: 'A' object has no attribute '_A__db_obj'

错误原因

  • 核心原因:你用mocker.patch("temp.A.__init__", return_value=None)完全替换了类A的构造方法,导致创建A实例时原__init__根本没有执行,自然不会初始化__db_obj这个私有属性,调用func1时就会找不到该属性。
  • 原代码还有两处语法错误(虽非本次报错直接原因,但需修正):
    • __init__方法缺少参数括号,正确写法是def __init__(self):
    • func1方法缺少self参数,且调用私有属性时名称写错,应为self.__db_obj.func2()而非self.__db.obj.func2()

修正后的测试方案

不需要替换整个__init__,直接mockDBClass或者类A的私有属性即可,两种可行方案:

方案1:Mock DBClass类

def test_func1(mocker):
    # Mock DBClass类,让它返回带有mock func2的实例
    mock_db_cls = mocker.patch("temp.DBClass")
    mock_db_cls.return_value.func2.return_value = {'data1': 'key1'}
    
    # 创建A实例,原__init__正常执行,但DBClass已被mock
    a = A()
    response = a.func1()
    
    assert response == {'data1': 'key1'}

方案2:直接Mock类A的私有属性

注意Python会对私有属性做名称改写,__db_obj实际在类内部会变成_A__db_obj:

def test_func1(mocker):
    # 先正常创建A实例
    a = A()
    # Mock私有属性_A__db_obj
    mock_db_obj = mocker.patch.object(a, '_A__db_obj')
    mock_db_obj.func2.return_value = {'data1': 'key1'}
    
    response = a.func1()
    assert response == {'data1': 'key1'}

内容的提问来源于stack exchange,提问作者M S Gokul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:57:19