dataclasses

您所在的位置:网站首页 Python中属性的类型怎么定义 dataclasses

dataclasses

2024-07-13 07:46| 来源: 网络整理| 查看: 265

init: 如为真值(默认),将生成 __init__() 方法。

如果类已经定义了 __init__(),此形参将被忽略。

repr: 如为真值(默认),将生成 __repr__() 方法。 生成的 repr 字符串将带有类名及每个字符的名称和 repr,并按它们在类中定义的顺序排列。 不包括被标记为从 repr 排除的字段。 例如: InventoryItem(name='widget', unit_price=3.0, quantity_on_hand=10)。

如果类已经定义了 __repr__(),此形参将被忽略。

eq: 如为真值(默认),将生成 __eq__() 方法。 此方法将把类当作由其字段组成的元组那样按顺序进行比较。 要比较的两个实例必须是相同的类型。

如果类已经定义了 __eq__(),此形参将被忽略。

order: 如为真值 (默认为 False),将生成 __lt__(), __le__(), __gt__() 和 __ge__() 方法。 这些方法将把类当作由其字段组成的元组那样按顺序进行比较。 要比较的两个实例必须是相同的类型。 如果 order 为真值且 eq 为假值,则会引发 ValueError。

如果类已经定义了 __lt__(), __le__(), __gt__() 或者 __ge__() 中的任意一个,将引发 TypeError。

unsafe_hash: 如为 False (默认值),则会根据 eq 和 frozen 的设置情况生成 __hash__() 方法。

__hash__() 会在对象被添加到哈希多项集例如字典和集合时由内置的 hash() 使用。 具有 __hash__() 就意味着类的实例是不可变的。 可变性是一个依赖于程序员的实际意图、__eq__() 是否存在和具体行为,以及 @dataclass 装饰器中 eq 和 frozen 旗标值的复杂特征属性。

在默认情况下,@dataclass 不会隐式地添加 __hash__() 方法,除非这样做是安全的。 它也没会添加或更改现有的显式定义的 __hash__() 方法。 设置类属性 __hash__ = None 对 Python 具有特定含义,如 __hash__() 文档中所述。

如果 __hash__() 没有被显式定义,或者它被设为 None,则 @dataclass 可能 会添加一个隐式 __hash__() 方法。 虽然并不推荐,但你可以用 unsafe_hash=True 来强制让 @dataclass 创建一个 __hash__() 方法。 如果你的类在逻辑上不可变但却仍然可被修改那么可能就是这种情况一。 这是一个特殊用例并且应当被小心地处理。

以下是针对隐式创建 __hash__() 方法的规则。 请注意你的数据类中不能既有显式的 __hash__() 方法又设置 unsafe_hash=True;这将导致 TypeError。

如果 eq 和 frozen 均为真值,则默认 @dataclass 将为你生成 __hash__() 方法。 如果 eq 为真值而 frozen 为假值,则:meth:!__hash__ 将被设为 None,即将其标记为不可哈希(因为它属于可变对象)。 如果 eq 为假值,则 __hash__() 将保持不变,这意味着将使用超类的 __hash__() 方法(如果超类是 object,这意味着它将回退为基于 id 的哈希)。

frozen: 如为真值 (默认为 False),则对字段赋值将引发异常。 这模拟了只读的冻结实例。 如果在类中定义了 __setattr__() 或 __delattr__(),则将引发 TypeError。 参见下文的讨论。

match_args: 如为真值 (默认为 True),则将根据传给生成的 __init__() 方法的形参列表来创建 __match_args__ 元组 (即使没有生成 __init__(),见上文)。 如为假值,或者如果 __match_args__ 已在类中定义,则不会生成 __match_args__。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3