attrs 库
比较 attrs 与数据类
attrs 库 是 CoddyKit 上的免费 Python Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
什么是 attrs?
attrs 是一个第三方库,多年前就率先采用了通过字段创建类的理念,早于 dataclasses 进入标准库。标准的 dataclasses 模块正是直接受它启发而设计的。
- attrs 需要单独安装:
pip install attrs。 - 它提供的功能比 dataclasses 更多。
- dataclasses 已内置于标准库,可以满足大多数日常需求。
现代 attrs API
现代 attrs 使用来自 attrs 命名空间的 @define 和 field()。其结构与数据类非常相似。
from attrs import define, field
@define
class Point:
x: int
y: int
p = Point(1, 2)
print(p)默认使用插槽
一个重要区别是:@define 类会自动使用 __slots__。这可以降低内存使用量,并防止意外添加未声明的属性。普通数据类使用常规的 __dict__,除非您传入 slots=True(Python 3.10 及更高版本)。
内置验证器
attrs 自带现成的验证器。字段可以声明一个在构造期间运行的验证器,并在值无效时引发错误。数据类没有内置验证功能;您需要在 __post_init__ 中自行编写。
from attrs import define, field
from attrs.validators import instance_of
@define
class User:
age: int = field(validator=instance_of(int))
User(30) # ok
User('oops') # raises TypeError转换器
转换器会在输入值存储之前对其进行转换。例如,可以自动将字符串转换为整数。这是数据类所缺少的另一项功能。
from attrs import define, field
@define
class Item:
price: int = field(converter=int)
i = Item('42') # stored as the integer 42
print(i.price)数据类中的等效实现
下面是使用标准库表达相同理念的方式。由于数据类不提供针对每个字段的钩子,因此验证和转换需要手动写入 __post_init__。
from dataclasses import dataclass
@dataclass
class Item:
price: int
def __post_init__(self):
self.price = int(self.price)
print(Item('42'))两者都有 asdict
两个库都提供 asdict 辅助函数。数据类的版本位于 dataclasses 中,attrs 的版本位于 attrs 中。两者的行为几乎完全相同。
from dataclasses import dataclass, asdict
@dataclass
class Point:
x: int
y: int
print(asdict(Point(1, 2)))attrs 中的冻结
attrs 同样支持不可变性。使用 @frozen(即 @define(frozen=True) 的快捷写法)创建只读实例,这与 @dataclass(frozen=True) 相似。
from attrs import frozen
@frozen
class Point:
x: int
y: int
p = Point(1, 2)
print(p)
# p.x = 9 would raise FrozenInstanceError功能比较
它们的特点如下:
- dataclasses:标准库的一部分,无需安装,涵盖基础功能。
- attrs:提供验证器、转换器,默认使用插槽,并支持更多配置。
- 两者都会生成
__init__、__repr__和__eq__。
您应该使用哪个?
如果您需要简单的数据持有类,并且不想添加额外依赖,请选择 dataclasses。如果您需要验证器、转换器或更丰富的配置,并且可以接受添加依赖,请选择 attrs。许多项目会先使用 dataclasses,只有在功能需求超出其能力范围时才迁移。
共同的渊源
由于 dataclasses 大量借鉴了 attrs,因此在两者之间迁移通常只需机械式修改:替换导入和装饰器,并调整验证器或转换器。掌握其中一个后,另一个也会很快熟悉。
@define对应@dataclass。attrs.field对应dataclasses.field。- 迁移到 dataclasses 时,将验证器移入
__post_init__。
快速检查
attrs 提供了哪项标准 dataclasses 模块没有内置提供的功能?
回顾
您比较了 attrs 与 dataclasses。
- attrs 启发了 dataclasses,并提供更多功能。
- attrs 增加了验证器、转换器,并默认使用插槽。
- dataclasses 已内置于标准库,无需安装。
- 选择能够满足需求的最简单工具。
常见问题解答
「attrs 库」课时是免费的吗?
是的 — 「attrs 库」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「attrs 库」这节课中我会学到什么?
比较 attrs 与数据类 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「attrs 库」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 定义数据类
- 默认值和 field()
- 冻结和比较选项
- attrs 库