繁体   English   中英

冻结对数据类意味着什么?

[英]What does frozen mean for dataclasses?

@dataclass(frozen=True)@dataclass(frozen=False)有什么区别? 我什么时候应该使用哪个?

在 Python 中,“冻结”意味着无法修改 object。 例如,考虑setfrozenset

>>> s = set((1, 2, 3))
>>> s
{1, 2, 3}
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> fs = frozenset((1, 2, 3))
>>> fs
frozenset({1, 2, 3})
>>> fs.add(4)
...
AttributeError: 'frozenset' object has no attribute 'add'

同样,使用dataclass frozen=True创建一个数据类意味着它的实例被冻结并且无法更改。

请注意, frozen仅适用于数据类实例本身—— frozen的数据类可以包含可变项,例如列表,而常规数据类可以包含冻结/不可变项,例如元组。


冻结对象的要点是避免意外修改,并保证值一致。

  • 前者有利于避免错误。 当不打算修改 object 时,将其frozen会通过立即错误显示意外修改。
  • 后者允许用作不可变的 object,例如dict的键。 默认情况下, frozen的数据类是可散列的,适合作为dict键。
from dataclasses import dataclass

@dataclass(frozen=True)
class Frozen:
    x: int
    y: int

named_points = {Frozen(0, 0): "Origin"}

请注意,散列性不仅取决于数据类,而且是递归的——包含listfrozen数据类不可散列,因为list不可散列。

“frozen:如果为true(默认为False),分配给字段将产生异常。这模拟只读冻结实例。如果在class中定义了setattr ()或delattr (),则引发TypeError。见讨论以下”

https://docs.python.org/3/library/dataclasses.html

因此,当您需要不可变数据对象时,请使用 freeze=true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM