【问题标题】:Why is __weakref__ removed by default when __slots__ is used?为什么在使用 __slots__ 时会默认删除 __weakref__?
【发布时间】:2019-06-13 07:16:41
【问题描述】:

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

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

【问题讨论】:

    标签: python weak-references slots


    【解决方案1】:

    我无法读心,但我怀疑基本原理是这样的:

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

    考虑到很少使用弱引用,默认禁用它可能被认为更简单更简单,并且可以选择重新启用。

    深入了解实现细节,从某种意义上说,无槽的用户定义类在基本对象标头之上和之上恰好有两个“槽”(一个用于__dict__,一个用于__weakref__),因此有__slots__ 说当__slots__ 起作用时,“用这个显式列表替换默认值”可以很自然地删除__dict____weakref__

    【讨论】:

      猜你喜欢
      • 2017-06-13
      • 2012-08-04
      • 1970-01-01
      • 2022-01-15
      • 2021-01-23
      • 2014-03-17
      • 2017-12-16
      • 2010-09-29
      • 1970-01-01
      相关资源
      最近更新 更多