在Python 3,object是的实例type和type也是一个实例object!
object
type
每个类如何可能从另一个派生?
有实施细节吗?
我使用进行了检查isinstance(sub, base),根据Python文档,它检查子类是否派生自基类:
isinstance(sub, base)
isinstance(object, type) Out[1]: True isinstance(type, object) Out[2]: True
这是Python中的一种极端情况:
请注意,您无法在Python中用自己的 东西 复制这种关系。这是语言中内置的一个例外。
在实现方面,这两个名称分别由PyBaseObject_Type(for object)和PyType_Type(for type)表示。
PyBaseObject_Type
PyType_Type
当您使用时isinstance,类型检查(在其他所有步骤均失败之后的最后一步)是通过type_is_subtype_base_chain以下方式完成的:
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”部分实际上已硬编码到实例检查中。
a
b
至于为什么object是a type,这实际上甚至更简单,因为它是在声明中以PyBaseObject_Type这种方式定义的:
PyTypeObject PyBaseObject_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "object", /* tp_name */ sizeof(PyObject), /* tp_basicsize */ …
在PyVarObject_HEAD_INIT本质上设置核心类型信息的东西,包括基本类型,这是PyType_Type。
PyVarObject_HEAD_INIT
这种关系实际上还有两个后果:
isinstance(object, object)
isinstance(type, type)