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

继承Pydantic BaseModel后类方法无法访问类属性的问题

Pydantic BaseModel继承后类方法无法访问类属性的问题

问题重现

正常运行的代码

class Person:
    age: int = 25
    
    @classmethod
    def printAge(cls):
        print('The age is:', cls.age)

继承BaseModel后的异常代码

from pydantic import BaseModel

class Person(BaseModel):
    age: int = 25
    
    @classmethod
    def printAge(cls):
        print('The age is:', cls.age)

报错信息

type object 'Person' has no attribute 'age'

原因分析

Pydantic的BaseModel会将类中带有类型注解的字段(包括带默认值的)识别为模型字段,而非普通的Python类属性。这些字段会被Pydantic内部存储在__fields__(Pydantic v1)或model_fields(Pydantic v2)字典中,不会直接保留在类的属性集合里,因此直接通过cls.age无法访问到该值。

解决方法

方法1:通过Pydantic内部字段字典获取默认值(兼容v1)

直接从__fields__字典中取出对应字段的默认值:

from pydantic import BaseModel

class Person(BaseModel):
    age: int = 25
    
    @classmethod
    def printAge(cls):
        print('The age is:', cls.__fields__['age'].default)

方法2:使用model_fields(Pydantic v2)

如果使用Pydantic v2版本,__fields__已被替换为model_fields,代码调整为:

from pydantic import BaseModel

class Person(BaseModel):
    age: int = 25
    
    @classmethod
    def printAge(cls):
        print('The age is:', cls.model_fields['age'].default)

方法3:标记为普通类属性(不参与模型字段)

如果age不需要作为Pydantic模型的字段(不需要参与序列化、验证等操作),可以用ClassVar标记它,让Pydantic将其视为普通类属性:

from pydantic import BaseModel
from typing import ClassVar

class Person(BaseModel):
    age: ClassVar[int] = 25
    
    @classmethod
    def printAge(cls):
        print('The age is:', cls.age)

注意:ClassVar标记的字段不会被包含在模型的实例中,仅作为类级别的属性存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:01:40