Cpython如何实现其类型对象,即类型的类型总是类型?

我知道python中的所有东西都是一个Object,并且这些对象的’type'(或类)是’type’.此外,类型类型也是类型本身. (正如here所说)

我不明白的是这个循环参考是如何实现的?所以我看了here.引用可能解释我要找的部分:

PyTypeObject* PyObject.ob_type

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

Foo_Type.ob_type = &PyType_Type;

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

编辑:我发现here

PyObject* PyType_Type

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

那个怎么样?

解决方法:

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

现在你有:

>>> type.__bases__
(<class 'object'>,)
>>> type(object)
<class 'type'>
>>> type(type(object))
<class '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)
上一篇:spring接口为@ModelAttribute param


下一篇:java – ui背后的类:包含JSF标记