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

普通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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 04:15:08