这是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);}从本质上讲,这会继续提高的类型层次结构,
a并对照来检查结果类型
b。如果找不到,则最后的方法是检查在这种情况下函数是否
b真的
object返回true:因为所有内容都是对象。因此,“一切都是实例
object”部分实际上已硬编码到实例检查中。
至于为什么
object是a
type,这实际上甚至更简单,因为它是在声明中以
PybaseObject_Type这种方式定义的:
PyTypeObject PybaseObject_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "object", sizeof(PyObject), …在
PyVarObject_HEAD_INIT本质上设置核心类型信息的东西,包括基本类型,这是
PyType_Type。
这种关系实际上还有两个后果:
- 由于一切都是对象,因此
object
它也是的一个实例object
:isinstance(object, object)
- 由于
PyType_Type
也与实施相同PyVarObject_HEAD_INIT
,type
也是一种:isinstance(type, type)
。



