不论何种编程语言,int都是很常见的基本数据类型之一,其定义如下:
包含一个引用计数、一个指向类型对象的指针和一个long型值
/* object.h */
#ifdef Py_TRACE_REFS
#define _PyObject_HEAD_EXTRA \
struct _object *_ob_next; \
struct _object *_ob_prev;
#define _PyObject_EXTRA_INIT 0, 0,
#else
#define _PyObject_HEAD_EXTRA
#define _PyObject_EXTRA_INIT
#endif
#define PyObject_HEAD \
_PyObject_HEAD_EXTRA \
Py_ssize_t ob_refcnt; \ // 引用数
struct _typeobject *ob_type; // 指向类型对象的指针, 用于标识对象的类型
typedef struct _object {
PyObject_HEAD // 定长类型的结构体头
} PyObject;
/* intobject.h */
typedef struct { // int对象的定义
PyObject_HEAD // Python中任何一个类型都有PyObject_HEAD, 因此每个类型都是PyObject,
// 可以把任何类型都理解为PyObject的派生类
long ob_ival; // 使用long型来存放值
} PyIntObject;
前面说过,Python的任何对象都是有类型的,通过成员ob_type来进行标识,现在看看int对象的类型PyInt_Type是什么:
/* object.h */
#define PyObject_VAR_HEAD \
PyObject_HEAD \
Py_ssize_t ob_size;
typedef struct _typeobject { // 类型对象的定义, 用于定义一种数据类型
PyObject_VAR_HEAD // 变长类型的结构体头
const char *tp_name; // 类型名称
Py_ssize_t tp_basicsize, tp_itemsize; // 类型的实例的基础大小, 类型的实例的item大小
// 注:这里为了与类型对象进行区分, 使用了类型的实例
// 譬如int类型的实例就是int对象
/* 以下均为实现标准操作的函数(指针) */
destructor tp_dealloc; // 析构函数
printfunc tp_print; // 打印函数
getattrfunc tp_getattr; // 获取属性函数
setattrfunc tp_setattr; // 设置属性函数
cmpfunc tp_compare; // 比较函数
reprfunc tp_repr; // repr函数
/* 以下均为基础数据类型的函数套件(包含多个函数指针的结构体) */
PyNumberMethods *tp_as_number; // 进行数值计算的函数簇(加减乘除等等)
PySequenceMethods *tp_as_sequence; // 进行序列计算的函数簇(获取长度、连接、切片等)
PyMappingMethods *tp_as_mapping; // 进行映射计算的函数簇
/* 更多标准操作 */
hashfunc tp_hash; // 求哈希值函数
ternaryfunc tp_call; //
reprfunc tp_str; // str函数
getattrofunc tp_getattro;
setattrofunc tp_setattro;
PyBufferProcs *tp_as_buffer; // 把类型实例作为输入输出缓冲区的函数簇
long tp_flags; // 定义可选/扩展属性存在的标志
const char *tp_doc; // document字符串
traverseproc tp_traverse;
inquiry tp_clear;
richcmpfunc tp_richcompare;
Py_ssize_t tp_weaklistoffset;
getiterfunc tp_iter;
iternextfunc tp_iternext;
struct PyMethodDef *tp_methods;
struct PyMemberDef *tp_members;
struct PyGetSetDef *tp_getset;
struct _typeobject *tp_base;
PyObject *tp_dict;
descrgetfunc tp_descr_get;
descrsetfunc tp_descr_set;
Py_ssize_t tp_dictoffset;
initproc tp_init;
allocfunc tp_alloc;
newfunc tp_new;
freefunc tp_free; // 低层次的内存释放函数
inquiry tp_is_gc;
PyObject *tp_bases;
PyObject *tp_mro;
PyObject *tp_cache;
PyObject *tp_subclasses;
PyObject *tp_weaklist;
destructor tp_del;
unsigned int tp_version_tag;
#ifdef COUNT_ALLOCS
Py_ssize_t tp_allocs;
Py_ssize_t tp_frees;
Py_ssize_t tp_maxalloc;
struct _typeobject *tp_prev;
struct _typeobject *tp_next;
#endif
} PyTypeObject;
/* intobject.h */
PyTypeObject PyInt_Type = { // PyInt_Type全局变量,所有int对象的ob_type都指向这里
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"int",
sizeof(PyIntObject),
0,
(destructor)int_dealloc, /* tp_dealloc */
(printfunc)int_print, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
(cmpfunc)int_compare, /* tp_compare */
(reprfunc)int_to_decimal_string, /* tp_repr */
&int_as_number, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
(hashfunc)int_hash, /* tp_hash */
0, /* tp_call */
(reprfunc)int_to_decimal_string, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
Py_TPFLAGS_BASETYPE | Py_TPFLAGS_INT_SUBCLASS, /* tp_flags */
int_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
int_methods, /* tp_methods */
0, /* tp_members */
int_getset, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
int_new, /* tp_new */
};