译文带你理解Python的dataclass装饰器

@dataclassPython dataclasses 模块中的一个 decorator。当使用 @dataclass 装饰器时,它会自动生成一些特殊方法,包括:

  • _ _ init _ _:用于初始化字段的构造函数
  • _ _ repr _ _:对象的字符串表示
  • _ _ eq _ _:对象之间的相等比较
  • _ _ hash _ _:使对象可用作字典键(如果值是可哈希的)

除了上述列出的方法之外,@dataclass 装饰器还有两个重要的属性。

  • Order(顺序):如果为 True(默认为 False),将生成 [__lt__()](<https://docs.python.org/3/reference/datamodel.html#object.__lt__>)[__le__()](<https://docs.python.org/3/reference/datamodel.html#object.__le__>)[__gt__()](<https://docs.python.org/3/reference/datamodel.html#object.__gt__>)[__ge__()](<https://docs.python.org/3/reference/datamodel.html#object.__ge__>) 方法;即 @dataclass(order=True)
  • Immutability(不可变性):通过使用 frozen=True 参数,可以使字段变为不可变;即 @dataclass(frozen=True)

简而言之,@dataclass 装饰器的主要目标是简化类的创建。

dataclass 装饰器的优势

使用 dataclass 装饰器有几个优势:

  • 减少样板代码:通过自动生成常见特殊方法,减少类所需的样板代码。
  • 可读性:通过使代码更简洁,集中在数据表示上,提高了代码的可读性
  • 默认值:可以直接在类定义中为属性提供默认值,减少了显式 __init__() 方法的需求。
  • 不可变性:通过将 @dataclassfrozen=True 选项结合使用,可以创建不可变的数据类,确保实例在创建后无法修改。

用法

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int

在这个例子中,Person 类被注解为 @dataclass,并声明了两个字段(nameage)。__init__()__repr__()__eq__()__hash__() 方法会自动生成。下面是如何使用每个生成的方法的解释:

  • __init__(self, ...)**:__init__ 方法会自动生成,参数对应于被注释属性。可以通过为属性提供值来创建类的实例。
person = Person('Sam', 45)
  • __repr__(self) -> str__repr__ 方法返回对象的字符串表示,用于调试和记录。在打印对象或在 f-string 中使用时,将调用 __repr__ 方法。
person # Person(name='Sam', age=45)
  • __eq__(self, other) -> bool__eq__ 方法根据属性检查两个对象是否相等。在使用等号运算符 (==) 比较对象时使用。
# 用法
person1 = Person('Sam', 45)
person1

person2 = Person('Sam', 46)
person2

print(person1 == person2) # False。 
  • __hash__(self) -> int__hash__ 方法为对象生成哈希值,允许实例用作集合和字典中的键。当类用作字典中的键或集合中的元素时,需要这个方法。

顺序

如果包括 order=True 选项,将生成额外的顺序方法(__lt____le____gt____ge__)。这些方法允许使用小于、小于或等于、大于和大于或等于运算符比较实例。如果在没有 order 的情况下对 Person 对象进行比较,将引发 TypeError

添加顺序后,我们可以执行比较。

order 默认为 False,这意味着除非显式启用,否则不会生成比较方法。比较基于字段值,而不是对象标识。

不可变性

使用 frozen=True 属性可以使 @dataclass 不可变;默认为 False

在上面的代码中,我们能够重新分配值给 Personname 字段。添加 frozen=True 后,将引发异常,不允许重新分配。

注意性能影响:frozen=True 会增加轻微的开销,因为需要额外检查不可变性。

总结

使用 dataclasses 模块,我们可以在类定义中为字段分配默认值。

默认值可以是任何数据类型,包括其他数据类或可变对象。它们在定义类时仅计算一次,而不是每次创建实例时。

相关推荐

  1. 译文理解Pythondataclass装饰

    2024-01-30 10:20:04       37 阅读
  2. 理解Python装饰 decorator

    2024-01-30 10:20:04       11 阅读
  3. Python装饰-装饰

    2024-01-30 10:20:04       22 阅读
  4. 新手如何学习理解Python装饰

    2024-01-30 10:20:04       39 阅读
  5. python装饰作用

    2024-01-30 10:20:04       21 阅读
  6. python装饰使用

    2024-01-30 10:20:04       18 阅读

最近更新

  1. 2024前端面试真题【CSS篇】

    2024-01-30 10:20:04       0 阅读
  2. 如何使用echart画k线图

    2024-01-30 10:20:04       0 阅读
  3. 【国产开源可视化引擎】Meta2d.js简介

    2024-01-30 10:20:04       0 阅读
  4. 【C语言】常见的数据排序算法

    2024-01-30 10:20:04       0 阅读
  5. MySQL 聚合函数

    2024-01-30 10:20:04       0 阅读
  6. 在Spring Boot中实现RESTful API设计

    2024-01-30 10:20:04       0 阅读

热门阅读

  1. StringJoiner工具demo

    2024-01-30 10:20:04       33 阅读
  2. 如何统一监听Vue组件报错

    2024-01-30 10:20:04       34 阅读
  3. STM32轮询模式串口收发不定长字符串

    2024-01-30 10:20:04       24 阅读
  4. 【笔记】Helm-5 Chart模板指南-4 模板函数和流水线

    2024-01-30 10:20:04       33 阅读
  5. Codeforces Round 835 (Div. 4)

    2024-01-30 10:20:04       29 阅读
  6. 【Qt】QInputDialog setGeometry: Unable to set geometry 问题

    2024-01-30 10:20:04       36 阅读
  7. 【Qt 多线程+opencv 读取和显示图像】

    2024-01-30 10:20:04       33 阅读
  8. QT C++语言格式化输出wchar_t * 中文乱码

    2024-01-30 10:20:04       31 阅读
  9. 什么是模板方法模式?它的实现方式有哪些?

    2024-01-30 10:20:04       37 阅读
  10. Python流程控制语句

    2024-01-30 10:20:04       35 阅读