Python 的 type 和 object 之间是怎么一种关系

 我来答
从空去听8
2017-09-30 · TA获得超过7441个赞
知道大有可为答主
回答量:6907
采纳率:93%
帮助的人:5610万
展开全部
我们先来看看 type 和 object 分别是什么。
type 实际上是:

#define PyVarObject_HEAD_INIT(type, size) \
1, type, size,

PyTypeObject PyType_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"type", /* tp_name */
sizeof(PyHeapTypeObject), /* tp_basicsize */
sizeof(PyMemberDef), /* tp_itemsize */
0, /* tp_base */
...
}

object 实际上是:

PyTypeObject PyBaseObject_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"object", /* tp_name */
sizeof(PyObject), /* tp_basicsize */
0, /* tp_itemsize */
0, /* tp_base */
...
}

也就是说,type 和 object 的前两个字段是一样的,都是1和 PyType_Type

ob_refcnt = 1 // 引用计数
ob_type = &PyType_Type // 指向一个类型对象,用来指定当前对象的类型

即,type 和 object 的 ob_type 都是 PyType_Type,而PyType_Type就是 type,所以 type 的ob_type 是自己。
我们来看看 isinstance() 做了什么:

#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)

[abstract.c]
PyObject_IsInstance(PyObject *inst, PyObject *cls)
{
static PyObject *name = NULL;

/* Quick test for an exact match */
if (Py_TYPE(inst) == (PyTypeObject *)cls)
return 1;
...
}

isinstance() 做的事情其实很简单,就是判断inst -> ob_type 指向的类型是不是 (PyTypeObject *)cls。
instance(object,type) <==> if object.ob_type == type return 1 else return 0;
从前面可以看到 ob_type = &PyType_Type,而 PyType_Type 就是 type,所以,显然object 被判断为了 type 的实例。
实际上他们在代码实现上并没有类与实例的关系,但是在判断的时候强加了这层关系。
================实例的关系说完了,下面说说继承关系===================
我们来看看 issubclass():

[abstract.c]
PyObject_IsSubclass(PyObject *derived, PyObject *cls)
{
...
return recursive_issubclass(derived, cls);
}
//最终转化成
[typeobject.c]
int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
{
mro = a->tp_mro;
if (mro != NULL) {
...
}
else{
do {
if (a == b)
return 1;
a = a->tp_base;
} while (a != NULL);
return b == &PyBaseObject_Type; //这一句!
}
}

从上面我们也可以看出 python 的继承机制。
我们也可以看到,如果一个类没有基类,那他的父类就是object ,即便在代码实现上它并没有基类,但是在 issubclass()中就是这样认为的!
那 type 到底有没有基类呢?目前我还没有找到 ,我会继续找的。即便有也只是给个标志位标识一下,并没有什么特殊的动作。
type 和 object 在代码实现上时平行的,没有父子类的关系,但是在判断的时候,开发者将 type 判断为了 object 的子类,以满足python 对外呈现的思想。
python 对外呈现的思想是:

object :是一切类的基类
type :一切类型都是它的实例

但实际上它的代码实现并不符合这样的思想,C 语言本身也没有类和继承的概念,开发者做了一些处理,让他们看起来是符合思想的。
总结:type 和 object 其实并没有继承与实例化的关系,只是开发者为了保持 python 纯正的思想,给他们添加了联系。添加联系的方式有两种:一种是设置标志位,如ob_type,一种是函数判断中做特殊处理(就像 PyType_IsSubtype 函数那样)。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式