Python 中的数据类 (dataclasses)
dataclasses 是 Python 标准库中从 3.7 版本开始新增的一个模块。它定义了 @dataclass 装饰器,该装饰器会自动为用户定义的类生成构造函数魔法方法 __init__()、字符串表示方法 __repr__()、重载 == 运算符的 __eq__() 方法(以及其他一些方法)。
dataclass 装饰器具有以下签名
dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)
所有参数都采用布尔值,指示是否自动生成相应魔法方法。
“init” 参数默认为 True。它将自动为类生成 __init__() 方法。
让我们使用 dataclass 装饰器定义 Student 类,如下所示
from dataclasses import dataclass @dataclass class Student(object): name : str age : int percent : float
自动生成的 __init__() 方法类似于
def __init__(self, name: str, age: int, percent: float): self.name = name self.age = age self.percent = percent
如果类显式定义了 __init__() 方法,则忽略 init 参数。
repr 参数也默认为 true。因此,__repr__() 方法将自动生成。__repr__() 是对象的正式字符串表示形式。如果类已定义 __repr__(),则忽略此参数。
eq 参数默认为 true。这将自动生成 __eq__() 方法。此方法在响应等于比较运算符 (==) 时被调用。同样,如果类已定义 __eq__(),则忽略此参数。
如果 “order” 参数为 true(默认值为 False),则将自动生成用于比较的魔法方法 __lt__()、__le__()、__gt__() 和 __ge__() 方法,它们分别实现比较运算符 < <= > 和 >=。如果 order 为 true 且 eq 为 false,则会引发 ValueError。如果类已定义任何这些方法,则会导致 TypeError。
unsafe_hash 参数如果为 False(默认值),则根据 eq 和 frozen 的设置生成 __hash__() 方法。
frozen 参数:如果为 true(默认为 False),则模拟只读冻结实例。
>>> from data_class import Student >>> s1=Student('Naveen', 21, 50.50) >>> s2=Student('Mangesh', 20, 50.00) >>> s1==s2 False
asdict()
此函数将类实例转换为字典对象。
>>> import dataclasses >>> dataclasses.asdict(s1) {'name': 'Naveen', 'age': 21, 'percent': 50.5}
astuple()
此函数将类实例转换为元组对象。
>>> dataclasses.astuple(s2) ('Mahesh', 20, 50.0)
make_dataclass()
此函数根据作为 fields 参数给出的元组列表创建新的 dataclass。
>>> NewClass=dataclasses.make_dataclass('NewClass', [('x',int),('y',float)]) >>> n = NewClass(10,20) >>> n NewClass(x=10, y=20)