在python3.7+中优雅的使用dataclass
[本文出自天外归云的博客园]
在 Python 3.7+ 中,dataclasses 是一个非常优雅的工具,可以轻松地创建简单的类,并自动生成常见的类方法,比如 __init__、__repr__ 等。以下是一些使用 dataclasses 时需要注意的事项:
- 导入 dataclasses 模块
在使用 dataclasses 之前,需要先导入 dataclasses 模块。例如:
from dataclasses import dataclass
- 使用
@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)
- 使用默认值参数
您可以在使用 @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)
- 使用类型提示
在 dataclasses 中,您可以像平常写 Python 代码时一样使用类型提示。例如:
from typing import List
@dataclass
class Person:
name: str
age: int
hobbies: List[str]
上述 Person 类的 hobbies 属性的类型是 List[str]。这将确保只能为 hobbies 属性分配一个字符串列表。如果有任何类型错误,则会在类型检查阶段抛出错误。此外,您还可以使用其他类型提示,例如 Tuple、Set 等。
- 使用
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,您可以节省大量的时间和精力。