我一直在阅读有关如何使 Python 类不那么动态的文章,特别是不允许用户动态创建新属性。我读过重载__setattr__
是一个很好的方法,而__slots__
不是要走的路。最后一个帖子上的一篇文章实际上表明它__slots__
可以破坏酸洗。(谁能证实这一点?)
但是,我只是在阅读 Python 2.2 的最新消息,而属性访问部分实际上建议将__slots__
其用于约束属性创建的目的,而不仅仅是像其他人建议的那样进行优化。从 Python 的历史来看,有谁知道它的初衷__slots__
是什么?约束变量创建是要被滥用的功能还是错误?人们__slots__
在实践中是如何使用的?有很多人看到__setattr__
过重载来限制属性创建吗?哪个最好?如果您更熟悉一种方法或另一种方法,请随时发布您所知道的方法的优缺点。另外,如果您有其他解决问题的方法,请分享!(请尽量不要只是重复__slots__
已经在其他线程中表达过。)
编辑:我希望避免讨论“为什么?”,但第一个答案表明这会出现,所以我会在这里说明。在有问题的项目中,我们使用这些类来存储“配置信息”,允许用户使用他们的(用户的)参数设置对象的属性,然后将对象传递给程序的另一部分。对象不仅仅是存储参数,所以字典不起作用。我们已经让用户不小心输入了错误的属性名称,最终创建了一个新属性,而不是设置程序期望的属性之一。这未被检测到,因此用户认为他们正在设置参数但没有看到预期的结果。这让用户感到困惑,而且很难发现。
编辑 2,重新酸洗:这些对象将是我们将来想要存储的东西,酸洗似乎是一种很好的方法。如果__slots__
显然是最好的解决方案,我们可能会找到另一种存储它们的方法,但酸洗肯定是有价值的,应该考虑在内。
编辑 3:我还应该提到,内存保护不是问题。很少会创建这些对象,因此节省的任何内存都可以忽略不计(例如 3-12 GB 机器上的 10 千字节)。