0Pricing
Python Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 定义数据类
  2. 默认值和 field()
  3. 冻结和比较选项
  4. attrs 库
← 返回 Python Academy