Python attrs vs dataclasses 的2025现状

冷炫風刃

冷炫風刃

2026-02-17

603人浏览

原创

@dataclass 是 python 3.7+ 新项目的默认选择,因其零依赖、原生类型提示及 ide/mypy 开箱即用;仅当需 attrs 的运行时验证、json 钩子或旧版兼容时才选用 attrs。

python attrs vs dataclasses 的2025现状

dataclass 是默认选择,除非你明确需要 attrs 的某项能力

Python 3.7+ 项目里,@dataclass 已是事实标准:零依赖、类型提示原生支持、IDE 和静态检查工具(如 mypy)开箱即用。NASA 用 attrs 做火星任务,不等于你写个配置类或 API 响应模型也得上 attrs——那是为极端可定制性与历史兼容性付出的额外维护成本。

  • 新项目、内部工具、FastAPI/Pydantic 模型层 → 优先用 @dataclass
  • 需要运行时字段验证、JSON 序列化钩子、或兼容 Python pydantic.BaseModel
  • 团队已有 attrs 代码库且字段逻辑复杂(比如大量 attr.ib(converter=...) 或自定义 __attrs_post_init__)→ 不必强行迁移

字段默认值写法不同,field(default_factory=list) 容易漏掉 default_factory

这是 dataclass 和 attrs 最常踩的坑:可变对象(list, dict)作默认值时,Python 会共享同一个对象实例。两者都要求显式用工厂函数,但语法位置和命名不一致。

  • dataclass:tags: list = field(default_factory=list) —— 必须用 field() 包裹,default_factory 是关键字参数
  • attrs:tags: list = attr.ib(factory=list) —— factoryattr.ib() 的参数,不是 default_factory
  • 错写成 tags: list = []tags: list = attr.ib(default=[]) → 多个实例共用同一列表,修改一个,全部“同步”变

序列化和校验不是 dataclass 的事,别硬塞 __post_init__

@dataclass 只负责结构定义和基础协议(__init__, __repr__, __eq__),它不校验字段类型、不处理缺失字段、也不自动转 JSON。有人在 __post_init__ 里手动 raise TypeError 或调 json.dumps(self.__dict__),这等于把 pydantic 的活儿自己干,还干不全。

千博企业网站系统2025 Build0310
千博企业网站系统2025 Build0310

千博HTML5自适应企业网站系统是以Asp+Access进行开发的html5自适应企业网站源码。

下载
  • 需要字段级校验(比如 age > 0)、缺失字段报错、或从 dict/json 自动加载 → 直接换 pydantic.BaseModel
  • 只需要轻量序列化(如日志打点、简单导出)→ 用 dataclasses.asdict()dataclasses.astuple(),别自己遍历 __dict__
  • 想加字段文档或元数据?Field(metadata={...}) 支持,但 IDE 不识别,不如注释或用 pydantic 的 Field(description=...)

attrs 的 @define 在 2025 年仍比 dataclass 多两个实用特性

attrs 并没过时,它在两个具体场景仍有不可替代性:一是运行时字段访问控制(kw_only=True 强制关键字传参),二是细粒度冻结行为(frozen=True 下仍允许特定字段在 __attrs_post_init__ 中修改)。dataclass 的 frozen 是全有或全无。

  • @define(kw_only=True):调用 User("alice", 25) 会报错,必须写 User(name="alice", age=25) —— 对 API 参数类防误用很有效
  • @define(frozen=True, slots=True) + self._cache = None__attrs_post_init__ 中赋值 → 冻结对象的同时保留缓存字段,dataclass 做不到这点
  • 但注意:attrs 需要 pip install attrs,而 dataclass 是标准库 —— CI 环境少一个依赖,就是少一个故障点

真正该纠结的不是 dataclass 还是 attrs,而是「这个类到底需不需要运行时行为」。纯数据容器就 dataclass;带校验/序列化/外部交互就 pydantic;只有当你需要 attrs 特有的字段级控制权,且不愿引入 pydantic 时,才值得多装一个包。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

1529

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

1376

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

584

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

1264

7

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

2025.12.22

77

5

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

2026.02.06

370

18

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

2026.05.09

153

23

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

2026.06.16

72

12

pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

2023.10.09

1231

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PyCharm官方快速入门指南
PyCharm官方快速入门指南

共0课时 | 0人学习

Python函数定义官方教程
Python函数定义官方教程

共0课时 | 0人学习

Python 3.14.6官方文档
Python 3.14.6官方文档

共0课时 | 0人学习