如何解决冻结对数据类意味着什么?
@dataclass(frozen=True)
和 @dataclass(frozen=False)
有什么区别?我什么时候应该使用哪个?
解决方法
在 Python 中,“冻结”意味着不能修改对象。例如,考虑 set
和 frozenset
:
>>> s = set((1,2,3))
>>> s
{1,3}
>>> s.add(4)
>>> s
{1,3,4}
>>> fs = frozenset((1,3))
>>> fs
frozenset({1,3})
>>> fs.add(4)
...
AttributeError: 'frozenset' object has no attribute 'add'
同样,使用 dataclass
创建 frozen=True
意味着其实例被冻结且无法更改。
请注意,frozen
仅适用于数据类实例本身——frozen
数据类可以包含可变项,例如列表,而常规数据类可以包含冻结/不可变项,例如元组。>
冻结对象的重点是避免意外修改,保证值一致。
- 前者有利于避免错误。当不打算修改对象时,将其设置为
frozen
会通过立即错误显示意外修改。 - 后者允许用作不可变对象,例如
dict
的键。frozen
数据类默认是可散列的,适合作为dict
键。
from dataclasses import dataclass
@dataclass(frozen=True)
class Frozen:
x: int
y: int
named_points = {Frozen(0,0): "Origin"}
请注意,散列性不仅取决于数据类,而且是递归的——包含 frozen
的 list
数据类不可散列,因为 list
不可散列。
"frozen:如果为 true(默认为 False),分配给字段将产生异常。这模拟只读冻结实例。如果 setattr() 或 delattr() 在类中定义,然后引发 TypeError。请参阅下面的讨论“
https://docs.python.org/3/library/dataclasses.html
因此,每当您需要不可变数据对象时,请使用frozen=true
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。