Python Academy · 课时

定义数据类

使用 @dataclass 消除样板代码

第 1 / 4 课13 个步骤

定义数据类 是 CoddyKit 上的免费 Python Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。

为什么使用数据类?

当您编写的类主要用于保存数据时,最终会不断重复相同的样板代码:__init__、__repr__ 和 __eq__。数据类模块会根据简单的字段声明,为您生成所有这些内容。

  • 需要编写和阅读的代码更少。
  • 在 __init__ 中出现拼写错误的机会更少。
  • 自 Python 3.7 起,它就是标准库的一部分。

传统方式

下面是一个用于保存点的普通类。请注意,仅仅保存两个数字就需要输入多少代码。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

p = Point(1, 2)
print(p.x, p.y)

@dataclass 装饰器

在类的上方应用 @dataclass,并使用类型注解声明字段。Python 会自动生成 __init__。

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

p = Point(1, 2)
print(p.x, p.y)

自动生成 __repr__

数据类还会生成易读的 __repr__,因此打印对象时会显示其字段,而不是内存地址。

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

print(Point(3, 4))

自动生成 __eq__

当数据类实例的所有字段都相等时,这两个实例会被判定为相等。无需手动编写 __eq__。

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

print(Point(1, 2) == Point(1, 2))
print(Point(1, 2) == Point(9, 9))

必须使用类型注解

每个字段都必须具有类型注解。正是注解告诉数据类机制,这个名称是一个字段。没有注解的直接赋值会成为普通的类属性,而不是字段。

from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int

u = User('Alice', 30)
print(u)

添加方法

数据类仍然是普通的类。您可以添加使用生成字段的常规方法。

from dataclasses import dataclass

@dataclass
class Rectangle:
    width: int
    height: int

    def area(self):
        return self.width * self.height

r = Rectangle(3, 4)
print(r.area())

修改字段

默认情况下,数据类实例是可变的,因此创建实例后,您可以像重新赋值普通属性一样重新赋值字段。

from dataclasses import dataclass

@dataclass
class Counter:
    value: int

c = Counter(0)
c.value += 5
print(c.value)

asdict 与 astuple

辅助函数 asdict() 和 astuple() 可以将实例转换为字典或元组,便于序列化。

from dataclasses import dataclass, asdict, astuple

@dataclass
class Point:
    x: int
    y: int

p = Point(1, 2)
print(asdict(p))
print(astuple(p))

嵌套数据类

数据类的字段本身也可以是另一个数据类。生成的 __repr__ 和 asdict() 会递归处理嵌套结构。

from dataclasses import dataclass, asdict

@dataclass
class Address:
    city: str

@dataclass
class Person:
    name: str
    address: Address

p = Person('Bob', Address('Paris'))
print(asdict(p))

何时使用数据类

当一个类主要用于将相关值组合在一起时,可以考虑使用数据类。

  • 配置对象。
  • 函数返回的记录。
  • 坐标或金额等简单值类型。

对于行为多于数据的类,使用普通类可能更易读。

快速检查

@dataclass 装饰器会自动生成什么?

回顾

您学会了使用 @dataclass 来消除样板代码。

  • 使用类型注解声明字段。
  • 自动生成 __init__、__repr__ 和 __eq__。
  • 使用 asdict() 和 astuple() 转换实例。
  • 仍然可以添加方法并嵌套数据类。
免费开始

用 AI 导师学习 Python — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
76
课程
320

常见问题解答

「定义数据类」课时是免费的吗?

是的 — 「定义数据类」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。

「定义数据类」这节课中我会学到什么?

使用 @dataclass 消除样板代码 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Python Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「定义数据类」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Python Academy 课中编写并运行代码吗?

能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

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