当前位置: 首页 > news >正文

《流畅的Python》读书笔记06(补充01): 数据类构建器 - 三类数据容器对比(简洁版)

Python 3.7+ 引入的@dataclass装饰器、collections.namedtuple以及typing.NamedTuple是三种用于简化数据容器类创建的工具,旨在减少__init____repr____eq__等样板代码的编写 。

构建器核心特性可变性默认值支持推荐使用场景
collections.namedtuple构建tuple的子类,实例不可变,支持字段名访问,内存效率极高。❌ 不可变Python 3.7+ 支持需要极简、只读且内存敏感的数据容器,例如坐标点、配置项。
typing.NamedTuple同样构建tuple子类,但强制要求类型注解,支持class语法,便于集成方法和文档。❌ 不可变✅ 支持需要类型提示(供 IDE/类型检查器使用)的不可变数据容器。
@dataclasses.dataclass类装饰器,自动生成常用方法,提供高度可定制性(如可变性、字段控制、后初始化钩子)。✅ 默认可变 (可设frozen=True为不可变)✅ 支持 (含field(default_factory=...)处理可变默认值)需要字段默认值、可变数据、复杂初始化逻辑(__post_init__)或高度定制的场景。

关键对比与选择策略

  1. 可变性namedtupleNamedTuple生成不可变元组子类;@dataclass默认生成可变类,但可通过frozen=True参数变为不可变。
  2. 类型注解NamedTuple@dataclass均支持类型注解,有利于代码可读性和静态类型检查。
  3. 默认值处理@dataclassfield(default_factory=...)能安全处理列表、字典等可变类型的默认值,避免实例间共享引用的问题。
  4. 扩展性NamedTuple@dataclass支持class语法,可方便地添加自定义方法(如__str__、业务逻辑方法)。
  5. 版本兼容性:若代码需在 Python 3.7 以下版本运行,应选择namedtupleNamedTuple

代码示例:核心用法

# 使用 @dataclass 创建可变数据类,并处理可变默认值 from dataclasses import dataclass, field @dataclass class ShoppingCart: items: list = field(default_factory=list) # 每次实例化生成独立列表 owner: str = "Guest" cart1 = ShoppingCart() cart1.items.append("apple") print(cart1) # ShoppingCart(items=['apple'], owner='Guest') # 使用 typing.NamedTuple 创建带类型注解和自定义方法的不可变类 from typing import NamedTuple class Coordinate(NamedTuple): lat: float lon: float def format(self) -> str: return f"{self.lat}, {self.lon}" point = Coordinate(55.756, 37.617) print(point.format()) # 55.756, 37.617 # point.lat = 60.0 # 此行会报错,因为实例不可变

潜在的设计考量:文章指出,若一个类仅包含数据字段而无任何关联行为(方法),可能是一种“数据类代码异味”,暗示了面向对象设计中的职责分配问题。在这种情况下,应考虑将操作这些数据的方法迁移到该数据类内部,以遵循“高内聚”的设计原则 。


参考来源

  • 《流畅的Python》读书笔记06: 第一部分 数据结构 - 数据类构建器
http://www.cnnetsun.cn/news/2483262.html

相关文章:

  • DLSS Swapper终极指南:智能革命重新定义游戏性能优化
  • LabVIEW与树莓派结合:图形化编程降低物联网开发门槛
  • 【会议征稿通知 | E3S出版 | EI 、Scopus稳定检索】第十二届能源材料与环境工程国际学术会议(ICEMEE 2026)
  • 指纹采集器模块选型指南|如何选择合适的指纹采集模块
  • Git提交者信息填错了?别慌,手把手教你用config命令修正(全局/本地/取消设置全攻略)
  • Clion配置ESP32开发环境
  • 别再只写CRUD了!用这个SpringBoot+Vue小Demo,带你理解前后端数据流转全流程
  • 告别ni488.h恐惧症:手把手教你用C++调用GPIB驱动控制仪器(附完整代码示例)
  • Prometheus 第三章grafana安装
  • 按实际印量付费——矮萝卜让企业不为“没用过”的印量买单
  • BLE广播数据那31个字节怎么用?从设备名到厂商数据,一文讲透LTV格式实战
  • 杭州E类人才、积分落户必看:如何利用软著快速攒够关键分值?
  • Matlab实现傅里叶变换:从核心原理到工程实践的全流程解析
  • 云鸢联机 · 服务器常见问题自助排查指南
  • Python+AI智能体(Agent)零基础入门全攻略:原理、架构、手搓代码与实战落地
  • OPC落地华强比,上午AI出方案,下午配齐零件,第二天样机上柜台,一人公司爆改华强北
  • 企业级前端开发终极指南:5分钟掌握Arco Design Pro实战应用
  • Perplexity真相校验器(已开源):Python轻量工具包,3行代码自动标注引用可信等级与时间偏差
  • 为什么92.7%的AI视频项目在第3秒开始失连?:2024年全球17个主流模型连贯性崩溃点压力测试报告(含可落地的4步韧性加固法)
  • 由C++速通Lua
  • win挂载liunx目录
  • cursor接入外部大模型教程!新手必看
  • 立创EDA专业版迁移保姆级教程:从标准版无缝升级,避免文件丢失
  • SOEM主站编译踩坑实录:WinPcap vs Npcap怎么选?CMake配置哪些关键点易出错?
  • 2026企业招聘平台选择趋势:前程无忧成为多类型岗位招聘的重要平台
  • 如何快速掌握B站视频下载:BilibiliDown终极指南
  • 文献同步总失败?Perplexity引用管理全链路故障排查,3分钟定位97%常见错误
  • 联想笔记本BIOS隐藏设置解锁完整指南:安全开启高级选项的终极方案
  • 从感知器到ChatGPT:BP算法如何成为深度学习‘基本功’的?
  • 架构可视化革命:用draw.io重构深度学习设计范式