在python3.7+中优雅的使用dataclass

软件开发与测试技术 / 2023-05-12 / 原文

[本文出自天外归云的博客园]

在 Python 3.7+ 中,dataclasses 是一个非常优雅的工具,可以轻松地创建简单的类,并自动生成常见的类方法,比如 __init____repr__ 等。以下是一些使用 dataclasses 时需要注意的事项:

  1. 导入 dataclasses 模块

在使用 dataclasses 之前,需要先导入 dataclasses 模块。例如:

from dataclasses import dataclass
  1. 使用 @dataclass 装饰器

对于需要使用 dataclasses 的类,只需要在类上加上 @dataclass 装饰器即可自动为其生成常见的类方法。例如:

@dataclass
class Person:
    name: str
    age: int

上述 Person 类使用了 @dataclass 装饰器,并指定了它的两个属性 name 和 age。现在,dataclasses 将自动生成 __init____repr__等类方法。因此,创建一个 Person 对象时不再需要手动编写这些方法。例如:

p1 = Person("Alice", 25)
print(p1)

输出结果为:

Person(name='Alice', age=25)
  1. 使用默认值参数

您可以在使用 @dataclass 装饰器时提供默认值参数。例如:

@dataclass
class Person:
    name: str = "Unknown"
    age: int = 0

这将为 Person 类的 name 和 age 属性提供默认值,从而使它们非必需。当手工创建 Person 对象时,如果指定了 name 和 age 的值,则使用指定值,如果没有指定,则使用默认值。例如:

p1 = Person("Alice", 25)
print(p1)  # Person(name='Alice', age=25)

p2 = Person()
print(p2)  # Person(name='Unknown', age=0)
  1. 使用类型提示

在 dataclasses 中,您可以像平常写 Python 代码时一样使用类型提示。例如:

from typing import List

@dataclass
class Person:
    name: str
    age: int
    hobbies: List[str]

上述 Person 类的 hobbies 属性的类型是 List[str]。这将确保只能为 hobbies 属性分配一个字符串列表。如果有任何类型错误,则会在类型检查阶段抛出错误。此外,您还可以使用其他类型提示,例如 TupleSet 等。

  1. 使用 asdict 方法

dataclasses 还提供了一个称为 asdict 的方法,它将 dataclass 对象转换为一个 Python 字典。例如:

p1 = Person("Alice", 25, ["reading", "traveling"])
print(p1)  # Person(name='Alice', age=25, hobbies=['reading', 'traveling'])

p1_dict = p1.asdict()
print(p1_dict)  # {'name': 'Alice', 'age': 25, 'hobbies': ['reading', 'traveling']}

上述代码将 Person 对象 p1 转换为一个 Python 字典。由于 hobbies 是一个列表,因此转换后的字典中的值也是一个列表。

总之,在 Python 3.7+ 中,dataclasses 是一个非常优雅的工具,可以轻松地创建简单的类,并自动生成常见的类方法。通过使用 dataclasses,您可以节省大量的时间和精力。