使用 __slots__ 有缺点吗?

Dav*_*ave 6 python django memory-management python-3.x

我正在使用 Python 3.7 和 Django。我正在读关于__slots__. 显然,__slots__可以通过提前列出所有对象属性来优化大量此类对象的内存分配。

class MyClass(object):
    __slots__ = ['name', 'identifier']
    def __init__(self, name, identifier):
        self.name = name
        self.identifier = identifier
        self.set_up()
Run Code Online (Sandbox Code Playgroud)

我可能很明显的问题是为什么我们不想对所有对象都这样做?使用有什么缺点吗__slots__

Duš*_*ďar 3

Luciano RamalhoFluent Python列出了以下注意事项

\n\n
\n

\xe2\x80\xa2 您必须记住在每个子类中重新声明__slots__,因为\n 继承的属性会被解释器忽略。

\n\n

\xe2\x80\xa2 实例将只能具有 中列出的属性__slots__,除非您将其包含__dict____slots__\xe2\x80\x94 中,但这样做可能会抵消内存节省。

\n\n

\xe2\x80\xa2 实例不能成为弱引用的目标,除非您\n 记得包含__weakref____slots__.

\n
\n

  • @Dušan Maďar 我不明白你的第一点。我刚刚进行了实验(Python 3.7.3),继承似乎按照我的预期工作。也就是说,没有 \_\_slots\_\_ 但从具有 \_\_slots\_\_ 的类派生的类的实例将具有 \_\_dict\_\_ 因此可以动态添加新成员,但分配给在父类的 \_\_slots\_\_ 中声明的变量不会分配给对象的 \_\_dict\_\_ 的条目。 (2认同)
  • @Dušan Maďar 我为将引用与认可混为一谈而道歉。我认为当你准备引用它们时,你就会愿意为它们辩护。我认为,除了特殊情况(你多久使用一次弱引用?),每个类声明后面都应该跟有\_\_slots\_\_。它并不普遍,至少在我看过的 Python 代码中,表明我错了。我仍然想知道为什么。 (2认同)