擅长:python、mysql、java
<p><a href="https://docs.python.org/3.8/library/collections.html#collections.namedtuple" rel="nofollow noreferrer">namedtuple</a>定义了<a href="https://github.com/python/cpython/blob/3.8/Lib/collections/__init__.py#L440" rel="nofollow noreferrer">^{<cd1>}</a>,因此您不能设置任何属性(它没有<code>__dict__</code>)</p>
<p><a href="https://docs.python.org/3/library/dataclasses.html#frozen-instances" rel="nofollow noreferrer">Frozen dataclasses</a>另一方面,在<a href="https://github.com/python/cpython/blob/3.8/Lib/dataclasses.py#L556" rel="nofollow noreferrer">^{<cd3>}</a>方法中执行手动检查,如果是冻结的实例,则引发异常</p>
<p>比较以下各项:</p>
<pre class="lang-py prettyprint-override"><code>>>> class Foo:
... __slots__ = ()
...
>>> f = Foo()
>>> f.__dict__ # doesn't exist, so object.__setattr__ won't work
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute '__dict__'
>>> @dataclass(frozen=True)
... class Bar:
... pass
...
>>> b = Bar()
>>> b.__dict__ # this exists, so object.__setattr__ works
{}
</code></pre>