Python 数据类 dataclass 基础用法

📅 2026/8/25 15:55:54
Python 数据类 dataclass 基础用法
P.现有国内的状况仍是极为欠缺AI方面的人才, 期望更多的人能够切实地投身至AI这个行业之中, 一同推动该行业向前发展, 进而增强我国在AI领域的竞争力。那些想要进行系统学习AI知识的朋友们啊, 可以去查看一下我用心精心打磨制作而成的教程 , 此教程是通俗易懂的那种, 就连高中生都是可以看得懂的, 并且里面涵盖着各种各样的段子, 这些段子风趣又幽默, 从深度学习的基础原理一直到各个领域的实战应用这儿都有着讲解, 我二十二年的AI积累全部都在这个教程里面了。需要留意的是, 这个教程仅仅是限定于真正想要入门AI的朋友, 不然的话去看看那些零散的博文也就足够了。前言于日常开发期间, 不管是开展AI数据处理工作, 还是进行后端接口开发工作, 又或是编写自动化脚本, 我们都无法避开这样一个场景: 借助类去封装一组数据。举例来说, 诸如存储用户信息, 提供配置参数, 给出数据集样本, 呈现接口返回值等。早些时候, 我们要是写一个再平常不过的数据类, 那得手动去写出构造方法, 写出打印方法, 写出比较方法, 甚至还得写出排序方法, 仅仅这些样板性质的代码, 就能写上十几行, 不但啰里啰嗦, 而且很容易出现差错。就犹如你前往餐厅用餐, 原本仅仅是打算点一道家常菜肴罢了, 然而服务员却让你亲自去洗菜, 亲自去切菜, 亲自去生火, 纯粹是白白浪费时间。于.7版本时, 官方推出了数据类, 将那套繁杂的操作直接一键予以简化。等到2026年, 已然更新至3.13稳定版、3.14测试版, 历经了无数次优化, 早就变成标准库里极为常用的工具之一, 不管是在AI工程开发领域, 还是Web后端领域, 亦或是数据分析领域, 这都是一项必备技能。这篇文章使用通俗表述, 配置接地例子, 讲透基础用法, 新手能易上手, 看完可直用于项目之中。一、先搞懂到底什么是 1.1 官方定义通俗翻译它是由标准库模块所提供的装饰器, 其专门被用于创建那种仅仅是用来进行数据存储的类, 它能够自动地为类去生成构造方法, 以及字符串表示, 还有相等性判断等这些常用的方法, 并不需要我们亲自手动去编写。简单打个比方1.2 版本兼容性2026年开发参考从.7 开始就进行了内置, 在 3.10 那个版本实施了重大优化, 到 3.13 版本又进一步对类型注解适配予以完善。在 2026 年时, 主流开发环境, 不管是 AI 训练所涉及的 conda 环境, 还是服务器部署所用到的环境, 都起码会是 3.10版本, 根本不用担心会存在兼容性方面的问题, 能够直接进行导入然后使它发挥作用, 不需要去安装任何第三方库。二、 基础入门: 十行代码被一行装饰器予以替代, 2.1基础使用步骤。使用只需要三步从那个标准层面的库之中导入用于装饰的器具对着自定义性质的相关类别上方添加上那个所谓的装饰器去定义关于类的那些被称作字段的部分并搭配上那种类型方面的注解, 虽说并非强制要求但却是比较推荐去做的那样。2.2 代码方面的对比: 普通一般的类 VS。先看传统普通类的写法以封装用户信息为例class User: def __init__(self, name: str, age: int, gender: str): self.name name self.age age self.gender gender def __repr__(self): return fUser(name{self.name}, age{self.age}, gender{self.gender}) def __eq__(self, other): if not isinstance(other, User): return False return (self.name, self.age, self.gender) (other.name, other.age, other.gender) # 实例化 user1 User(张三, 20, 男) user2 User(张三, 20, 男) print(user1) # 手动写了__repr__才能正常打印 print(user1 user2) # 手动写了__eq__才能判断相等单单是最为基础的那三项办法, 就已然撰写了十几行之多, 倘若再增添入排序以及哈希办法, 那么代码将会变得更长。再看写法同样的功能代码直接减半from dataclasses import dataclass dataclass class User: name: str age: int gender: str # 实例化 user1 User(张三, 20, 男) user2 User(张三, 20, 男) print(user1) # 自动生成__repr__输出User(name张三, age20, gender男) print(user1 user2) # 自动生成__eq__输出True瞧见没得? 装饰器自行助力我们造就了, , 三个关键方法, 其代码精简到了无以复加的程度, 并且还不会产生手动编写代码时出现的拼写差错。2.3 核心特性自动生成的方法默认情况下会自动生成以下方法构造方法, 用以初始化实例属性, 打印实例时返回友好字符串, 而非对象地址的默认形式, 判断两个实例是否相等, 需按字段逐一比较, 根据字段生成哈希值此为可选开启项///, 比较排序方法同样为可选开启项。这些方法, 皆是开发期间最为常用的, 可不就是直接帮我们全都包揽下来嘛, 简直就称得上是开发领域的“懒人用的神奇工具”。三、 核心基础参数按需定制数据类用来控制所生成的方法以及类的行为的装饰器, 是支持多个参数的, 这同样是在基础用法里必须要掌握的知识点。在2026年的开发过程当中, 最为常用的参数存在6个, 我们会对这6个参数逐个进行拆解。3.1 冻结数据类禁止修改属性参数值True/False默认False它所具备的作用是, 把实例设定成不可变类型, 一旦完成实例化之后, 就不可以对字段值进行修改, 要是进行修改的话, 将会直接抛出异常。所适用的场景为, 对不可变的配置参数予以封装, 针对 AI 数据集的固定样本, 进行相关操作, 还有常量定义。代码示例from dataclasses import dataclass dataclass(frozenTrue) class AIConfig: model_name: str batch_size: int learning_rate: float # 实例化 config AIConfig(LLaMA-4, 32, 0.001) print(config) # 尝试修改属性直接报错 config.batch_size 64 # 抛出FrozenInstanceError: cannot assign to field batch_size通俗来讲, True这般的情况, 好似是给数据加上了一把锁, 能够封堵住修改的入口, 以此来防止在开发期间出现误而批改一些关键的配置局面, 特别是在AI训练这个过程当中, 要避免学习率、批次大小这类属于核心的参数被意外地进行篡改, 如此这般。3.2 init控制是否生成方法参数值True/False默认True作用是, 当设为False之时, 便不会自动去生成构造方法, 而是需要我们手动来编写。适用场景需要自定义构造逻辑不使用默认的参数初始化。3.3 repr控制是否生成方法参数值True/False默认True作用设为False时实例打印会恢复默认的对象地址格式。3.4 eq控制是否生成方法参数值True/False默认True作用设为False时无法用判断两个实例是否相等。3.5 order开启实例比较与排序参数值True/False默认False作用自动生成、、、方法支持实例排序。适用于场景, 是对于数据类实例列表开展排序, 像是AI数据集依照样本大小进行排序, 还有用户按照年龄进行排序。代码示例from dataclasses import dataclass dataclass(orderTrue) class Student: name: str score: int # 创建实例列表 students [Student(李四, 85), Student(张三, 92), Student(王五, 78)] # 按分数升序排序 students_sorted sorted(students) print(students_sorted) # 输出[Student(name王五, score78), Student(name李四, score85), Student(name张三, score92)]3.6 控制哈希值生成参数值True/False默认False作用强制生成方法让实例可作为字典的键或存入集合。四、 字段进行高级基础用法时呈现出的情况是, 存在着默认值以及可变类型, 其中一部分是4.1所涉及到的基础默认值。针对字段来进行默认值的设置工作, 而此项情形和普通函数参数的情况是一样的, 那么直接在字段的后面去进行赋值的操作就可以了:from dataclasses import dataclass dataclass class User: name: str age: int 18 # 默认年龄18 gender: str 未知 # 默认性别未知 # 不传默认值参数 user User(小明) print(user) # User(name小明, age18, gender未知)4.2 避坑关键可变类型默认值用field(...)这里存在着一个开发方面经典的坑, 即列表、字典这类可变类型, 是不能够直接当作默认值的。错误写法from dataclasses import dataclass dataclass class User: name: str hobbies: list [] # 错误可变类型直接设默认值 user1 User(张三) user2 User(李四) user1.hobbies.append(篮球) print(user2.hobbies) # 输出[篮球]两个实例共用同一个列表成因在于, 默认值于类定义之际便已生成, 全部实例都会共同享有同一个可变对象, 这情形如同多位居室内的成员共同使用一个衣柜一般, 当其中一人放入了衣物, 其他所有人都能够察觉到。对使用.field的示例, 以其参数来给每一个实例打造全新的可变样式的对象 , 这是正确的书写方式。from dataclasses import dataclass, field dataclass class User: name: str hobbies: list field(default_factorylist) # 正确用法 tags: dict field(default_factorydict) user1 User(张三) user2 User(李四) user1.hobbies.append(篮球) print(user1.hobbies) # [篮球] print(user2.hobbies) # []互不干扰接收一个没有参数的函数, 每一次进行实例化的时候, 都会去调用这个函数将其用来生成全新的默认值, 如此便能够完美地解决掉可变类型共享方面的问题。五、 实用工具函数数据转换与修改此模块给出额外4个有用工具式函数, 属于2026年开发期间高频施行的操作, 特地用于处置对象为数据类的实例操作, 并专门来处理数据类构造体, 且专门用于处置数据类实例化对象。5.1 将实例转为字典适用场景AI数据序列化、接口返回值、JSON转换。from dataclasses import dataclass, asdict dataclass class AISample: sample_id: int content: str label: str sample AISample(1, 这是一条AI训练数据, 正向) sample_dict asdict(sample) print(sample_dict) # {sample_id: 1, content: 这是一条AI训练数据, label: 正向}5.2 将实例转为元组适用场景数据存储、函数参数传递。from dataclasses import astuple sample_tuple astuple(sample) print(sample_tuple) # (1, 这是一条AI训练数据, 正向)5.3 修改字段生成新实例对于为True的实例而言, 其是不能够直接进行修改的, 不过能够基于原本的实例去创建新的实例, 在这个过程中并不需要再次去传所有的参数。from dataclasses import dataclass, replace dataclass(frozenTrue) class AIConfig: model_name: str batch_size: int config AIConfig(LLaMA-4, 32) # 生成新实例仅修改batch_size new_config replace(config, batch_size64) print(new_config) # AIConfig(model_nameLLaMA-4, batch_size64)5.4 初始化后执行自定义逻辑倘若存在要于实例初始化完毕之后去开展某些计算或者进行处理的情况, 像是对字段予以拼接, 对数据进行校验, 那么能够对方法加以定义:from dataclasses import dataclass dataclass class User: first_name: str last_name: str full_name: str None def __post_init__(self): # 初始化后拼接全名 self.full_name f{self.first_name}{self.last_name} user User(张, 三) print(user.full_name) # 张三六、2026年实际开发中的应用场景不是那种徒有其表的形式, 在二零二六年的相关开发进程当中, 特别是人工智能这个领域, 其应用的场景范围极其广阔。AIT数据封装, 即封装训练样本, 以及测试集, 还有模型配置参数来替代杂乱的字典, 以此提升代码可读性Web接口开发, 包括接口的请求体以及响应体封装, 相比起来更轻量, 适用于简单场景配置文件解析, 是读取YAML或者JSON配置文件并转为实例, 从而方便调用自动化脚本, 要封装任务参数以及日志信息, 进而减少样板代码测试用例, 需封装测试数据, 进行统一管理, 避免出现硬编码。相较于像attrs这样的第三方库 它是标准库 不存在依赖 具备轻量的特点 有着高性能 在较为简单的数据场景当中 它属于最优的选择。七、 基础避坑指南, 可变类型默认值务必得用, 这可是极易踩到的坑, 新手绝对要牢记实例不可进行修改, 如需修改时要采用生成新实例的方式, 千万别强行去破解冻结字段顺序会对排序产生影响, 开启order后, 会依照字段定义顺序来比较, 核心排序字段要放置在前面类型注解仅仅起着提示作用而不进行校验, 不会强制校验字段类型, 若想做类型校验可以搭配在一块继承的时候要留意参数顺序, 当子类继承时, 没有默认值的字段必须得放在前面。八、总结。其身为标准库的关键工具, 借由极为简洁的代码化解了数据类封装的难题, 干脆彻底地告别了繁杂琐碎的样板代码。从基础的装饰器运用开始, 历经参数定制、字段默认值环节, 再到实用的工具函数, 只要掌握这些基础用法, 便足以应对九成的日常开发场景。二零二六年的开发工作, 特别是人工智能工程化开发, 所追求的是高效、简洁以及可维护, 这与该需求完美吻合, 无需再去撰写重复的内容, 将精力投放于核心业务逻辑之上, 这才是开发的正确做法。对刚开始学的人来讲, 是一定得掌握住的基础要点内容, 这个东西呢不光能够提升代码品质水平之高, 并且还能够协助你培育形成较为优良的编码习惯性做法, 接下来我还会去分享出来的高级运用方式方法, 像是继承、嵌套以及和AI框架一起搭配着运用等等所有这些, 期待你的留意关注哟。P.S. 目前国内还是很缺AI人才的希望更多人能真正加入到AI行业共同促进行业进步增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 教程通俗易懂高中生都能看懂还有各种段子风趣幽默从深度学习基础原理到各领域实战应用都有讲解我22年的AI积累全在里面了。注意教程仅限真正想入门AI的朋友否则看看零散的博文就够了。