在Python 3中,object
是type
的实例,type
也是object
的实例!
每个类如何从另一个派生出来?
任何实施细节?
我使用isinstance(sub, base)
检查了这个,根据Python文档,它检查子类是否派生自基类:
isinstance(object, type)
Out[1]: True
isinstance(type, object)
Out[2]: True
答案 0 :(得分:19)
这是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
”部分的实例实际上是硬编码到实例检查中。
至于为什么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)
。