3. 基本数据类型之int

不论何种编程语言,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 */
};

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值