这是Python中的一种极端情况:
请注意,您无法在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
是atype
,这实际上甚至更简单,因为它是在声明中以PyBaseObject_Type
这种方式定义的:
PyTypeObject PyBaSEObject_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"object", /* tp_name */
sizeof(PyObject), /* tp_basicsize */
…
在PyVarObject_HEAD_INIT
本质上设置核心类型信息的东西,包括基本类型,这是PyType_Type
。
这种关系实际上还有两个后果: