4

我知道python中的所有东西都是一个对象,并且这些对象的“类型”(或类)是“类型”。加上类型的类型也是类型本身。(正如这里很好解释的那样)

我不明白的是这个循环引用是如何实现的?所以我看这里。引用可能解释我正在寻找的部分:

PyTypeObject* PyObject.ob_type

这是类型的类型,也就是它的元类型。它由 PyObject_HEAD_INIT 宏的参数初始化,其值通常应为 &PyType_Type。但是,对于必须(至少)在 Windows 上可用的动态可加载扩展模块,编译器会抱怨这不是有效的初始化程序。因此,约定是将 NULL 传递给 PyObject_HEAD_INIT 宏,并在模块初始化函数开始时显式初始化此字段,然后再执行其他任何操作。这通常是这样完成的:

Foo_Type.ob_type = &PyType_Type;

由于 C 不是基于 OOP 的,我知道当一个人创建一个类时,它可以有一个属性来指向对象本身作为它自己的类。我确信我在这里缺乏理解导致我处于困惑状态,任何人都可以指出这是否是其他脚本语言或某种模式设计中的常见做法,如果有人可以对此有所了解,我会很感激的。

编辑:我在这里发现:

PyObject* PyType_Type

这是类型对象的类型对象;它与 Python 层中的 type 和 types.TypeType 是同一个对象。

那个怎么样?

4

1 回答 1

4

定义 PyType_Type.ob_type = &PyType_Type 的代码涉及几个间接。这一切都在函数_Py_ReadyTypes()调用时开始PyType_Ready(&PyType_Type)。在调用函数之前,成员tp_baseob_type都是NULL。该函数首先设置type->tp_base&PyBaseObject_Typeobject在 Python 空间中),然后设置type->ob_type = PyBaseObject_Type.ob_type. 代码使用Py_TYPE()which 只是ob->ob_type. 由于对象的类型是类型,因此代码将类型的类型设置为类型。

现在你有:

>>> type.__bases__
(<class 'object'>,)
>>> type(object)
<class 'type'>
>>> type(type(object))
<class 'type'>

该定义使 type 成为 object 加上自身的实例,并且 object 成为 type 的实例。

>>> isinstance(type, object)
True
>>> isinstance(object, type)
True
>>> isinstance(type, type)
True

类型初始化代码在 Python 伪代码中更容易理解:

# object's class is type
object.__class__ = type
# PyType_Ready(type) sets:
type.__bases__ = (object,)
type.__class__ = type(object)
于 2013-09-09T21:16:12.237 回答