为什么在使用 __slots__ 时默认删除 __weakref__?

Why is __weakref__ removed by default when __slots__ is used?

我认为 __slots__ 的主要目的是通过允许显式指定属性来节省内存使用,而不是使用 __dict__ 允许对实例进行动态 属性 分配。所以我以某种方式理解为什么在使用 __slots__ 时默认删除 __dict__。但为什么它同时默认删除 __weakref__

参考:https://docs.python.org/3/reference/datamodel.html#slots

我不会读心术,但我怀疑理由是这样的:

  1. 如果在使用 __slots____weakref__ 没有被默认禁用,提供一种显式保存关联内存的方法将需要另一种特殊的 opt-out 机制
  2. 更多的特殊情况增加了语言的复杂性,而这个不会提供真正的好处

鉴于很少使用弱引用,默认情况下禁用它可能被认为更简单,可以选择重新加入。

深入了解实现细节,在某种意义上,无时隙 user-defined 类 恰好有两个 "slots"(一个用于 __dict__,一个用于 __weakref__)在基础 object header 之上,所以让 __slots__ 说 "Replace the default with this explicit list" 可以很自然地删除 __dict____weakref__ 当 [=11] =]开始发挥作用。