普通Python类与Pydantic类的区别是什么?
Python常规类与Pydantic类的核心区别
示例对比
常规Python类
class Node: def __init__(self, chave=None, esquerda=None, direita=None): self.chave = chave self.esquerda = esquerda self.direita = direita
Pydantic类
from datetime import datetime from typing import List, Optional from pydantic import BaseModel class User(BaseModel): id: int name = 'John Doe' # 默认值 signup_ts: Optional[datetime] = None # 可选字段,默认None friends: List[int] = [] # 列表类型默认空列表
1. 类型校验与自动转换
- 常规类:完全没有内置类型校验机制,传任何类型的参数都不会触发报错,后续逻辑可能因类型不匹配出问题。比如给
Node的chave传字符串,程序不会拦截,但后续若按数值处理就会出错。 - Pydantic类:严格按照字段注解的类型校验参数,还支持自动转换兼容类型。比如给
User的id传字符串"123",会自动转为整数123;若传"abc",则直接抛出ValidationError,明确提示类型不匹配。
2. 初始化代码更简洁
- 常规类:必须手动编写
__init__方法,逐个给实例属性赋值,代码冗余且容易遗漏字段。 - Pydantic类:继承
BaseModel后无需编写__init__,实例化时直接传入参数即可自动绑定到对应属性,还能直接在类属性上定义默认值(如name = 'John Doe'),大幅简化代码量。
3. 序列化/反序列化无需手动实现
- 常规类:若要将实例转为字典或JSON格式,需要自己编写转换逻辑,比如遍历实例的
__dict__或手动拼接字段,过程繁琐。 - Pydantic类:内置
dict()、json()方法,一行代码就能完成实例到字典或JSON字符串的转换,同时自动处理复杂类型(如datetime自动转为ISO格式字符串)。
4. 字段规则直观清晰
- 常规类:哪些字段必填、哪些可选,只能通过阅读
__init__的参数默认值判断,不看代码无法快速知晓字段规则。 - Pydantic类:通过
Optional注解标记可选字段,结合默认值设置,一眼就能区分必填字段(如id: int无默认值,必须传参)和可选字段(如signup_ts: Optional[datetime] = None),字段规则一目了然。
5. 内置数据验证与明确错误提示
- 常规类:若需要验证参数合法性,必须在
__init__中手动编写判断逻辑,否则即使参数不符合要求也不会主动报错,问题可能隐藏到后续执行阶段才暴露。 - Pydantic类:实例化时自动触发全字段验证,若参数不符合规则(比如
friends传入非整数列表),会抛出包含详细错误信息的异常,便于快速定位问题。
内容的提问来源于stack exchange,提问作者Nivaldo Inácio
相关产品推荐
相关产品推荐

