冻结对数据类意味着什么?
什么之间的区别@dataclass(frozen=True)和@dataclass(frozen=False)?我什么时候应该使用哪个?
回答
在 Python 中,“冻结”意味着不能修改对象。例如,考虑set和frozenset:
>>> 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'
同样,创建dataclasswithfrozen=True意味着它的实例被冻结并且无法更改。
请注意,这frozen仅适用于数据类实例本身——frozen数据类可以包含可变项,例如列表,而常规数据类可以包含冻结/不可变项,例如元组。
冻结对象的重点是避免意外修改,并保证值一致。
- 前者有利于避免错误。当一个对象不打算被修改时,让它
frozen通过一个即时错误揭示意外修改。 - 后者允许用作不可变对象,例如 a 的键
dict。甲frozen数据类是通过默认可哈希和适合作为dict密钥。
from dataclasses import dataclass
@dataclass(frozen=True)
class Frozen:
x: int
y: int
named_points = {Frozen(0, 0): "Origin"}
请注意,散列性不仅取决于数据类,而且是递归的——frozen包含 a的数据类list不可散列,因为list不可散列。