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

时间:2019-01-19 03:42:46

标签: python weak-references slots

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

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

1 个答案:

答案 0 :(得分:4)

我看不懂,但我怀疑理由是这样的:

  1. 如果使用__weakref__时默认未禁用__slots__,则提供一种显式保存关联内存的方法将需要另一种特殊的退出机制
  2. 更多特殊情况会增加语言的复杂性,而这并不会带来真正的好处

鉴于根本上不经常使用弱引用,默认情况下禁用它并选择重新加入,可能会被认为更简单。

从某种意义上讲,从某种意义上讲,未插槽化的用户定义类在基础对象标头的上方和上方恰好有两个“插槽”(一个用于__dict__,一个用于__weakref__),因此具有__slots__说“用此显式列表替换默认值”很自然地在__dict__起作用时同时删除__weakref____slots__