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

使用Pytest测试Python子类时出现父类属性未找到的AttributeError

解决Pytest测试子类时父类属性AttributeError异常

核心问题原因

你的代码存在三个关键语法/逻辑错误,直接触发了AttributeError:

  1. 父类Entity的构造函数名拼写错误:__init_少了一个下划线,应为__init__,导致子类调用super().__init__()时无法触发父类构造逻辑,self.errors和self.id从未被初始化。
  2. 子类Product的__init__方法缺少self参数,这是Python类方法的必填绑定参数,缺失会导致实例属性无法正确关联。
  3. 调用validate_is_datetime时参数不匹配:父类方法需要attr_name和attr_value两个参数,但你仅传入了一个值。

修正后的代码

entity.py(修复构造函数与语法错误)

from abc import ABC
import uuid
from datetime import datetime

# 包含基础验证布尔函数的工具类,例如:is_valid_datetime
from util import Validator

class Entity(ABC):
    id: str
    errors: list[dict]

    # 修正构造函数命名
    def __init__(self) -> None:
        self.id = ""
        self.errors = []

        if not self.id:
            self.id = uuid.uuid4().hex

        self.validate()

    def validate(self) -> None:
        if len(self.errors) > 0:
           raise ValueError(self.errors)

    # 修正条件语句冒号缺失问题,补充返回值
    def validate_is_datetime(self, attr_name: str, attr_value: datetime) -> bool:
        if Validator.is_valid_datetime(attr_value):
            return True
        else:
            self.errors.append(
                {
                    "type": "datetime",
                    "loc": f"Entity, {attr_name}",
                    "msg": "Attribute should be a valid datetime",
                    "input": attr_value
                }
            )
            return False

product.py(修复__init__参数与方法调用)

from entity import Entity

class Product(Entity):
    name: str
    price: str

    # 补充self参数,修正验证方法调用参数
    def __init__(self, name: str, price: str) -> None:
        self.name = name
        # 传递属性名与属性值两个参数
        self.validate_is_datetime("name", self.name)

        self.price = price

        super().__init__()

测试验证

修正后运行pytest,会触发预期的ValueError(因字符串类型的name不满足日期格式验证),而非AttributeError。若需专门测试验证失败场景,可添加如下用例:

import pytest
from product import Product

def test_product_invalid_name_raises_value_error():
    with pytest.raises(ValueError) as excinfo:
        Product(name="Iphone 8", price="150")
    assert len(excinfo.value.args[0]) > 0
    assert excinfo.value.args[0][0]["msg"] == "Attribute should be a valid datetime"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 03:16:15