Python 3:对象如何成为类型的实例?

Python 3: How can object be instance of type?

在Python3中,objecttype的一个实例,type也是object的一个实例!

怎么可能每个 class 都派生自另一个?

任何实施细节?

我使用 isinstance(sub, base) 检查了这一点,根据 Python 文档,它检查子 class 是否派生自基础 class:

isinstance(object, type)
Out[1]: True

isinstance(type, object)
Out[2]: True

这是Python中的边缘案例之一:

  • Python 中的所有内容都是一个对象,因此由于 object 是所有内容的基本类型,因此 type(Python 中的内容)是 object.
  • 因为object是一切的基础类型,所以object也是类型,这使得object type.
  • 的实例

请注意,这种关系不是您可以在 Python 中用您自己的 事物 复制的。这是语言中内置的一个异常。


在实现方面,这两个名称由PyBaseObject_Type(代表object)和PyType_Type(代表type)表示。

当您使用 isinstance 时,类型检查——在最后一步,在其他一切都失败之后——由 type_is_subtype_base_chain:

完成
type_is_subtype_base_chain(PyTypeObject *a, PyTypeObject *b)
{
    do {
        if (a == b)
            return 1;
        a = a->tp_base;
    } while (a != NULL);

    return (b == &PyBaseObject_Type);
}

这实质上是在 a 的类型层次结构中向上移动,并根据 b 检查结果类型。如果找不到,那么最后的手段是检查 b 是否实际上是 object 在这种情况下函数 returns 为真:因为一切都是对象。所以“一切都是 object 的实例”部分实际上被硬编码到实例检查中。

至于为什么objecttype,这个其实更简单,因为它在declaration of PyBaseObject_Type:

中就是这么定义的
PyTypeObject PyBaseObject_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "object",                                   /* tp_name */
    sizeof(PyObject),                           /* tp_basicsize */
    …

PyVarObject_HEAD_INIT 本质上设置了核心类型信息,包括基本类型,即 PyType_Type

这段关系其实还有两个后果:

  • 既然一切都是对象,object也是object的一个实例:isinstance(object, object)
  • 由于PyType_Type也是用相同的PyVarObject_HEAD_INIT实现的,type也是一种类型:isinstance(type, type).