我认为__slots__
的主要目的是通过允许显式指定属性来节省内存使用,而不是使用__dict__
来允许在实例上进行动态属性分配。因此,我以某种方式理解了为什么在使用__dict__
时默认删除__slots__
的原因。但是为什么它同时默认删除__weakref__
?
答案 0 :(得分:4)
我看不懂,但我怀疑理由是这样的:
__weakref__
时默认未禁用__slots__
,则提供一种显式保存关联内存的方法将需要另一种特殊的退出机制鉴于根本上不经常使用弱引用,默认情况下禁用它并选择重新加入,可能会被认为更简单。
从某种意义上讲,从某种意义上讲,未插槽化的用户定义类在基础对象标头的上方和上方恰好有两个“插槽”(一个用于__dict__
,一个用于__weakref__
),因此具有__slots__
说“用此显式列表替换默认值”很自然地在__dict__
起作用时同时删除__weakref__
和__slots__
。