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

Pydantic根验证器无法访问类属性问题求助

Pydantic root_validator无法访问类属性的解决方法

问题原因

你代码里的description在BaseClass中是用类型注解定义的模型字段,Pydantic在构建模型类时,会将这类字段从类属性转移到模型的__fields__字典中,不再保留为类属性。所以直接通过cls.description访问时,会提示类没有该属性。另外SubClass中直接赋值description = "foo"的方式也不对,这不会把它保留为类属性,而是会被当作模型字段的默认值处理,但依然无法通过类直接访问。

解决方案

方案1:如果description是模型字段,从__fields__中获取默认值

把SubClass中字段的默认值设置正确,然后在root_validator里通过模型的__fields__字典访问字段的默认值:

from pydantic import BaseModel, root_validator
from typing import Dict, Any

class BaseClass(BaseModel):
    description: str

    @root_validator(pre=True)
    def initialize(cls, values: Dict[str, Any]) -> Dict[str, Any]:
        # 从模型字段配置中获取默认值
        print(cls.__fields__['description'].default)
        return values

class SubClass(BaseClass):
    # 正确定义模型字段的默认值
    description: str = "foo"

方案2:如果description是类属性(非模型字段),用ClassVar标记

如果不需要description作为模型的实例字段,只是类属性,需要用ClassVar标记,避免被Pydantic当作模型字段处理:

from pydantic import BaseModel, root_validator
from typing import Dict, Any, ClassVar

class BaseClass(BaseModel):
    # 标记为类属性,不参与模型字段校验
    description: ClassVar[str]

    @root_validator(pre=True)
    def initialize(cls, values: Dict[str, Any]) -> Dict[str, Any]:
        print(cls.description)
        return values

class SubClass(BaseClass):
    description = "foo"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:47:17