当创建一个类时,会生成对该类的四个引用,该类从未在type.__new__
的命名空间参数中传递过__classcell__
,也就是一个没有任何函数需要操作码LOAD_NAME - __class__
的类。我可以解释其中一个,但由于我几乎看不懂C,我只能推测其他3个。最明显的是,第一个是类在其中定义的模块的__dict__
中的引用。另一个在typeobject.c
的缓存中。过了一段时间,如果一个类的引用计数降到4以下,它就会被销毁,这对于函数中定义的类来说是一件好事,因为在函数执行之后,没有办法删除它。
另外,在type.mro
用来生成mro的任何地方都可能有一个引用。你知道吗
最后,我猜最后一个是零参数super
可以访问的地方,这就是我要了解的真正信息:为什么在类定义之外创建的函数不能与零参数super
一起工作,即使它的__code__.co_names
中有'__class__'
,而它的__closure__
中有类的单元格?仍然产生RuntimeError: super(): __class__ cell not found
。你知道吗
有__classcell__
的类(我说有,因为我相信名称最终会被删除)在创建时有5个引用,比没有多了一个。由于在所有提到零参数super()
或__class__
的函数的__closure__
中包含类对象的单元格是相同的,我认为types.FunctionType.__closure__
描述符使用额外的引用来生成包含这些单元格的tuple
是一个很好的选择。你知道吗
让我们看看^{} :
在这个列表中,我们可以看到缺少的3个引用来自} 。(第三个条目是
__dict__
和__weakref__
descriptors以及类的^{__mro__
可能不明显,但我们可以确认:)__dict__
和__weakref__
描述符管理对Foo
实例的__dict__
和__weakref__
属性的访问,它们需要对Foo
的引用来进行类型检查,以确保它们仅用于Foo
实例。你知道吗__mro__
是Python搜索的类序列,用于解析Foo
的类属性,以及解析由数据描述符管理的Foo
的实例属性或实例__dict__
中没有条目的实例属性。你知道吗相关问题 更多 >
编程相关推荐