在python的世界中一切皆对象,所有的子类都是继承自同一个父类,object
那object 到底是什么呢?
来看源码定义
typedef struct _object {
_PyObject_HEAD_EXTRA
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
} PyObject;
这个object 其实就是一个结构体,Py_ssize_t ob_refcnt;
记录了 某个对象被引用的次数 python 通过 #define Py_INCREF(op)
宏来增加引用计数, 通过#define Py_DECREF(op)
宏来减少引用计数, 对象初始化时使用 #define _Py_NewReference(op)
宏来初始化引用计数为 1。当该计数等于 0 时 就会被垃圾回收器回收
struct _typeobject *ob_type;
记录了该对象的类型
_PyObject_HEAD_EXTRA
官方的注释是 /* Define pointers to support a doubly-linked list of all live heap objects. */ 为所有在堆上存活的对象定义的支持双向链接的指针
因此这个object 构成了所有python对象的基石, 所有的对象都会有 引用计数 和 对象类型
这两个特征, 但是其他对象由于各自不同,因此还会有自己的属性。
struct _typeobject
这个结构体还定义了
const char *tp_name;
该类型的名称
Py_ssize_t tp_basicsize, tp_itemsize;
创建类型时分配的内存大小
等诸多关于类型创建对象所用到的函数指针,在对象创建初始化时,根据对象类型的不同可以指定不同的对象支持的不同操作,这正是一个对象区别于另外一个对象的原因
例如,如果创建的对象是 int 对象
那么它就需要用到该函数指针 PyNumberMethods *tp_as_number;
定义该int 对象支持的操作方法
如果该对象是字典类型
那么初始化时就需要用到该函数指针PyMappingMethods as_mapping;
定义了字典对象应该支持的方法
object 源码地址: https://github.com/python/cpython/blob/master/Include/object.h,
https://github.com/python/cpython/blob/master/Objects/object.c