2024-05-13 14:28:13 发布
网友
我认为__slots__的主要目的是通过允许显式指定属性来节省内存使用,而不是使用__dict__来允许实例上的动态属性分配。所以我理解了为什么在使用__slots__时__dict__被默认删除。但是为什么它同时默认删除__weakref__?你知道吗
__slots__
__dict__
__weakref__
引用:https://docs.python.org/3/reference/datamodel.html#slots
我看不懂头脑,但我怀疑原理是这样的:
考虑到很少使用弱引用,在默认情况下禁用它可能被认为更简单,可以选择重新加入。你知道吗
跳转到实现细节,从某种意义上说,未开槽的用户定义类在基本对象头上方正好有两个“槽”(一个用于__dict__,一个用于__weakref__),因此__slots__说“用这个显式列表替换默认值”使得__dict__和__weakref__在__slots__起作用时,很自然地同时删除__dict__和__weakref__。你知道吗
我看不懂头脑,但我怀疑原理是这样的:
__weakref__
时默认情况下没有禁用__slots__
,那么提供一种显式保存关联内存的方法将需要另一种特殊的opt-out机制考虑到很少使用弱引用,在默认情况下禁用它可能被认为更简单,可以选择重新加入。你知道吗
跳转到实现细节,从某种意义上说,未开槽的用户定义类在基本对象头上方正好有两个“槽”(一个用于
__dict__
,一个用于__weakref__
),因此__slots__
说“用这个显式列表替换默认值”使得__dict__
和__weakref__
在__slots__
起作用时,很自然地同时删除__dict__
和__weakref__
。你知道吗相关问题 更多 >
编程相关推荐