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

时间:2015-08-13 18:07:50

标签: python python-3.x python-3.4

在Python 3中,objecttype的实例,type也是object的实例!

每个类如何从另一个派生出来?

任何实施细节?

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

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

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

1 个答案:

答案 0 :(得分:19)

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

  • Python中的所有内容都是一个对象,因为object是所有内容的基本类型,type(在Python中是某种东西)是object的实例。
  • 由于object是所有内容的基本类型object也是类型,这使object成为type

请注意,您可以使用Python中自己的 thing 复制此关系。这是语言中的一个例外。

在实施方面,这两个名称由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,在这种情况下函数返回true:因为一切都是对象。因此,“一切都是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)