这是 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,在这种情况下,函数返回true:因为一切都是对象。所以“一切都是object的实例”部分实际上是硬编码到实例检查中的。
至于为什么object 是type,这实际上更简单,因为它只是在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)。