定义数据类
使用 @dataclass 消除样板代码
定义数据类 是 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 反馈 — 无需本地设置。