网站设计师培训学校,永久持续更新,wordpress快速安装,开发银行助学贷款系统dataclass 是 Python dataclasses 模块中的一个 decorator。当使用 dataclass 装饰器时#xff0c;它会自动生成一些特殊方法#xff0c;包括#xff1a;
_ _ init _ _#xff1a;用于初始化字段的构造函数_ _ repr _ _#xff1a;对象的字符串表示_ _ eq _ _#xff1a…dataclass 是 Python 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(orderTrue)。Immutability不可变性通过使用 frozenTrue 参数可以使字段变为不可变即 dataclass(frozenTrue)。
简而言之dataclass 装饰器的主要目标是简化类的创建。
dataclass 装饰器的优势
使用 dataclass 装饰器有几个优势
减少样板代码通过自动生成常见特殊方法减少类所需的样板代码。可读性通过使代码更简洁集中在数据表示上提高了代码的可读性。默认值可以直接在类定义中为属性提供默认值减少了显式 __init__() 方法的需求。不可变性通过将 dataclass 与 frozenTrue 选项结合使用可以创建不可变的数据类确保实例在创建后无法修改。
用法
from dataclasses import dataclassdataclass
class Person:name: strage: int在这个例子中Person 类被注解为 dataclass并声明了两个字段name 和 age。__init__()、__repr__()、__eq__() 和 __hash__() 方法会自动生成。下面是如何使用每个生成的方法的解释
__init__(self, ...)**__init__ 方法会自动生成参数对应于被注释属性。可以通过为属性提供值来创建类的实例。
person Person(Sam, 45)__repr__(self) - str__repr__ 方法返回对象的字符串表示用于调试和记录。在打印对象或在 f-string 中使用时将调用 __repr__ 方法。
person # Person(nameSam, age45)__eq__(self, other) - bool__eq__ 方法根据属性检查两个对象是否相等。在使用等号运算符 () 比较对象时使用。
# 用法
person1 Person(Sam, 45)
person1person2 Person(Sam, 46)
person2print(person1 person2) # False。 __hash__(self) - int__hash__ 方法为对象生成哈希值允许实例用作集合和字典中的键。当类用作字典中的键或集合中的元素时需要这个方法。
顺序
如果包括 orderTrue 选项将生成额外的顺序方法__lt__、__le__、__gt__ 和 __ge__。这些方法允许使用小于、小于或等于、大于和大于或等于运算符比较实例。如果在没有 order 的情况下对 Person 对象进行比较将引发 TypeError。
添加顺序后我们可以执行比较。
order 默认为 False这意味着除非显式启用否则不会生成比较方法。比较基于字段值而不是对象标识。
不可变性
使用 frozenTrue 属性可以使 dataclass 不可变默认为 False。
在上面的代码中我们能够重新分配值给 Person 的 name 字段。添加 frozenTrue 后将引发异常不允许重新分配。
注意性能影响frozenTrue 会增加轻微的开销因为需要额外检查不可变性。
总结
使用 dataclasses 模块我们可以在类定义中为字段分配默认值。
默认值可以是任何数据类型包括其他数据类或可变对象。它们在定义类时仅计算一次而不是每次创建实例时。