擅长:python、mysql、java
<p>FJ指出的确实正确…属性的名称是<code>itemData</code>而不是<code>ItemData</code>。你知道吗</p>
<p>作为Python的新手,您可能期望输入错误会引发错误……类似于“Packet has no attribute ItemData”之类的错误,但这不会发生。默认情况下,Python类将属性存储在字典中,因此将属性分配给以前不存在的类就像向字典添加新映射一样。你知道吗</p>
<p>奇怪的是,您的代码以一种迂回的方式突出显示了一个例外……这与描述符<code>__slots__</code>有关。<code>__slots__</code>将类更改为不再在动态字典中存储属性,而是在静态结构中存储属性。有关详细信息,请参见<a href="https://stackoverflow.com/questions/472000/python-slots">Usage of __slots__?</a>。你知道吗</p>
<p>通常,在定义<code>__slots__</code>时,不能将未在<code>__slots__</code>中指定的属性赋值。所以你可能会问…既然你为你的类定义了<code>__slots__</code>,为什么你没有得到一个<code>AttributeError</code>?答案是<code>__slots__</code>只适用于“新样式类”,请参见<a href="https://stackoverflow.com/questions/54867/old-style-and-new-style-classes-in-python">What is the difference between old style and new style classes in Python?</a>了解新旧样式类之间的区别。你知道吗</p>
<p>如果您将<code>Packet</code>定义为从基类<code>object</code>继承,比如<code>class Packet(object):</code>,而不是仅仅<code>class Packet()</code>,那么它将成为一个新样式的类,并且当您尝试分配给<code>ItemData</code>时,确实会得到一个<code>AttributeError</code></p>