继承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
相关产品推荐
相关产品推荐

