为什么在使用 __slots__ 时默认删除 __weakref__?
Why is __weakref__ removed by default when __slots__ is used?
我认为 __slots__
的主要目的是通过允许显式指定属性来节省内存使用,而不是使用 __dict__
允许对实例进行动态 属性 分配。所以我以某种方式理解为什么在使用 __slots__
时默认删除 __dict__
。但为什么它同时默认删除 __weakref__
?
我不会读心术,但我怀疑理由是这样的:
- 如果在使用
__slots__
时 __weakref__
没有被默认禁用,提供一种显式保存关联内存的方法将需要另一种特殊的 opt-out 机制
- 更多的特殊情况增加了语言的复杂性,而这个不会提供真正的好处
鉴于很少使用弱引用,默认情况下禁用它可能被认为更简单,可以选择重新加入。
深入了解实现细节,在某种意义上,无时隙 user-defined 类 恰好有两个 "slots"(一个用于 __dict__
,一个用于 __weakref__
)在基础 object header 之上,所以让 __slots__
说 "Replace the default with this explicit list" 可以很自然地删除 __dict__
和 __weakref__
当 [=11] =]开始发挥作用。
我认为 __slots__
的主要目的是通过允许显式指定属性来节省内存使用,而不是使用 __dict__
允许对实例进行动态 属性 分配。所以我以某种方式理解为什么在使用 __slots__
时默认删除 __dict__
。但为什么它同时默认删除 __weakref__
?
我不会读心术,但我怀疑理由是这样的:
- 如果在使用
__slots__
时__weakref__
没有被默认禁用,提供一种显式保存关联内存的方法将需要另一种特殊的 opt-out 机制 - 更多的特殊情况增加了语言的复杂性,而这个不会提供真正的好处
鉴于很少使用弱引用,默认情况下禁用它可能被认为更简单,可以选择重新加入。
深入了解实现细节,在某种意义上,无时隙 user-defined 类 恰好有两个 "slots"(一个用于 __dict__
,一个用于 __weakref__
)在基础 object header 之上,所以让 __slots__
说 "Replace the default with this explicit list" 可以很自然地删除 __dict__
和 __weakref__
当 [=11] =]开始发挥作用。