<p>你为什么要限制开发者这么做?除了“我不想让他们这么做”之外,还有什么技术原因吗?如果没有,就不要做。在</p>
<p>总之,使用<code>__slots__</code>可以节省内存(不是<code>__dict__</code>),因此这是更好的解决方案。但是,如果某些代码需要对象具有<code>__dict__</code>,则无法使用它。在</p>
<p>如果有一个很好的理由限制它(同样,你确定有一个吗?)<em>或者</em>你需要节省一点内存,去<code>__slots__</code>。在</p>
<hr/>
<p>{{cd5>在阅读之后,你可能需要使用whitelist来保存它。这样您就可以显示一些更有用的信息,例如哪些<em>类似的</em>属性可用。可能的实现方式如下:</p>
<pre><code>class Test(object):
__slots__ = ('foo', 'bar', 'moo', 'meow', 'foobar')
def __setattr__(self, name, value):
try:
object.__setattr__(self, name, value)
except AttributeError:
alts = sorted(self.__slots__, key=lambda x: levenshtein(name, x))
msg = "object has no attribute '{}', did you mean '{}'?"
raise AttributeError(msg.format(name, alts[0]))
</code></pre>
<p>我测试它的<code>levenshtein()</code>是来自<a href="http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#Python" rel="nofollow">this site</a>的实现4。如果<em>不太聪明的</em>用户,您可能需要使错误更加详细,并包括所有接近的匹配项,而不仅仅是第一个匹配项。在</p>
<p>您可以通过创建一个只包含<code>__setattr__</code>方法的mixin类来进一步改进代码。这样,您就可以将代码排除在实际类之外,如果需要,还可以使用自定义的<code>__setattr__</code>(只需在mixin中使用<code>super(...).__setattr__(...)</code>,而不是<code>object.__setattr__</code>)</p>