擅长:python、mysql、java
<p>创建类后不能修改<code>__slots__</code>属性。这是因为它会导致奇怪的行为</p>
<p>想象一下下面的情景</p>
<pre><code>class A:
__slots__ = ["x"]
a = A()
A.__slots__.append("y")
a.y = None
</code></pre>
<p>在这种情况下会发生什么?最初没有为第二个插槽分配空间,但是根据slots属性,<code>a</code>应该能够为<code>y</code>分配空间</p>
<p><code>__slots__</code>并不是保护可以访问和不能访问的名称。相反<code>__slots__</code>是关于减少对象的内存占用。通过尝试修改<code>__slots__</code>,您将无法实现<code>__slots__</code>想要实现的优化</p>
<h2>插槽如何减少内存占用</h2>
<p>通常,对象的属性存储在<code>dict</code>中,这本身就需要相当多的内存。如果要创建数百万个对象,则这些命令所需的空间将变得不可接受<code>__slots__</code>通知生成类对象的python机制,该类的实例引用的属性将非常多,属性的名称将是什么。因此,该类可以通过将属性直接存储在实例上而不是存储在<code>dict</code>中来进行优化。它将(指向的指针)属性的内存直接放在对象上,而不是为对象创建一个新的<code>dict</code></p>