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)

更新于: 2019年7月30日

610 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始
广告