【发布时间】:2014-01-21 18:08:51
【问题描述】:
您可以使用列表或元组(或者可能是任何可迭代的?)在新型 python 类中定义__slots__。创建实例后,该类型仍然存在。
鉴于元组总是比列表更高效并且是不可变的,你有什么理由不想为__slots__ 使用元组?
>>> class foo(object):
... __slots__ = ('a',)
...
>>> class foo2(object):
... __slots__ = ['a']
...
>>> foo().__slots__
('a',)
>>> foo2().__slots__
['a']
【问题讨论】:
-
作为一个网站说明,我怀疑你和可能的人一样,认为
__slots__以某种方式为你提供了更像是一个 C 结构的东西,它更快更紧凑,而且甚至可能是您首先使用它的原因。如果是这样:插槽使用描述符,因此访问foo.a基本上是Foo.a.get(foo)而不是通常的foo.__dict__['a'],这通常更慢而不是更快。优点是为每个实例保存一个dict对象,如果您有很多实例和很少的属性(如文档明确所说),而不是效率。 -
仅供参考,在 Python 3.3 中有一个新的
dict实现(参见 PEP412),这似乎使__slots__变得多余。请参阅this question 了解更多信息。 -
@aquavitae:我认为那里的答案是错误的;对于大多数值得使用的用例,
__slots__仍然不是多余的。
标签: python