<p>我一直在阅读如何降低Python类的动态性,特别是不允许用户动态创建新属性。我读过<a href="http://code.activestate.com/recipes/389916-example-setattr-getattr-overloading/" rel="nofollow noreferrer">overloadding ^{<cd1>} is a good way to do this</a>,和{a2}。其中一个<a href="https://stackoverflow.com/a/472017/1965323">post on this last thread</a>实际上表明<code>__slots__</code>可以破坏酸洗。(有人能证实吗?)在</p>
<p>但是,我刚刚在阅读python2.2的whatsnew,<a href="http://docs.python.org/2/whatsnew/2.2.html#attribute-access" rel="nofollow noreferrer">the attribute access section</a>实际上建议使用<code>__slots__</code>来约束属性创建,而不仅仅是像其他人建议的那样用于优化。从Python的历史来看,有人知道<code>__slots__</code>的初衷是什么吗?约束变量的创建是一个特性还是一个被滥用的bug?人们是如何看待<code>__slots__</code>在实践中使用的?是否有许多人见过<code>__setattr__</code>重载以限制属性创建?哪一个最好?如果你对一种方法或另一种方法比较熟悉,请随时发表你所知道的方法的利弊。另外,如果你有不同的解决问题的方法,请分享!(请尽量不要重复<code>__slots__</code>中表达的<code>__slots__</code>的缺点。)</p>
<p>编辑:我希望避免讨论“为什么?”,但第一个答案表明这会出现,所以我在这里陈述。在这个项目中,我们使用这些类来存储“配置信息”,允许用户用他们的(用户)参数设置对象的属性,然后将对象传递给程序的另一部分。对象不仅仅是存储参数,所以字典就不能工作了。我们已经有用户意外地输入了一个错误的属性名,最后创建了一个新的属性,而不是设置程序所期望的属性之一。这没有被检测到,因此用户认为他们正在设置参数,但没有看到预期的结果。这让用户感到困惑,而且很难发现。通过约束属性创建,异常将被抛出,而不是静默地通过。在</p>
<p>编辑2,重新酸洗:这些对象将是我们将来要存储的东西,酸洗似乎是一个很好的方法。如果<code>__slots__</code>显然是最好的解决方案,我们也许可以找到另一种方法来储存它们,但是酸洗肯定是有价值的,应该加以考虑。在</p>
<p>编辑3:我还应该提一下,保存记忆不是问题。只有很少的对象会被创建,所以节省的任何内存都可以忽略不计(比如在一台3-12GB的机器上,内存是10s千字节)。在</p>