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

Man*_*nth 10 python python-3.x python-3.4

在Python 3,object是的实例typetype也是一个实例object!

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

任何实施细节?

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

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

isinstance(type, object)
Out[2]: True
Run Code Online (Sandbox Code Playgroud)

pok*_*oke 19

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

  • Python中的所有东西都是一个对象,所以因为它object是所有东西的基本类型type(在Python中是某种东西)是一个实例object.
  • 既然object是一切的基本类型,object也是一个类型,它是object一个实例type.

请注意,这种关系是您无法在Python中使用自己的东西复制的.这是语言中的一个例外.


在实现方面,这两个名称由PyBaseObject_Type(for object)和PyType_Type(for 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);
}
Run Code Online (Sandbox Code Playgroud)

这基本上保持了类型层次结构,a并检查结果类型b.如果找不到,那么最后的办法是检查b实际上是否实际上object函数返回true:因为一切都是对象.所以"一切都是实例object"部分实际上是硬编码到实例检查中.

至于为什么object是a type,这实际上更简单,因为它只是在以下声明中PyBaseObject_Type定义:

PyTypeObject PyBaseObject_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "object",                                   /* tp_name */
    sizeof(PyObject),                           /* tp_basicsize */
    …
Run Code Online (Sandbox Code Playgroud)

PyVarObject_HEAD_INIT本质上设置核心类型信息的东西,包括基本类型,这是PyType_Type.

这种关系实际上还有两个后果:

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