Python内部机制-PyTypeObject对象

本文详细解析Python中的PyTypeObject对象,它是定义新类型和控制对象行为的关键。PyTypeObject包含类型信息、初始化、打印、比较等操作,支持多态性。通过实例分析了其组成部分,如类型信息、标准操作和对象的多态实现。
摘要由CSDN通过智能技术生成

PyTypeObject对象

不知道你还否还记得在我的上一篇文章中关于PyObject中的ob_type成员,在上篇文章中我没有对它进行展开,只是告诉读者这是用来指明当前对象是何种类型以及一些类型相关的信息.那么本篇博文则是单独把ob_type拿出来分析,通过查看PyObject对象,你可以发现ob_type成员是一个struct _typeobject而这个数据结构在Python内部有另外一个typedef的别名,那就是PyTypeObject这也是本文需要分析的一个内部对象.因为这个数据结构很长,有很多的数据成员,为了让代码更易读,我不会全部列出所有的成员,而是一点点揭开面纱.

PyTypeObject的用途?

Python官方文档上说PyTypeObject或许是Python对象机制中最为重要的一个结构体,因为这个结构体可以用来定义新的类型,这个结构体控制了对象的行为.此外这个结构体的相比于Python内部的其它对象而言也是相当的大,这是因为这个结构体需要存储大量的数据成员和大量的C函数指针, 这其中包含了了一部分与类型相关的函指针.总的来说PyTypeObject就是用来描述一种类型对象的行为的结构体,比如对于一个int类型的对象和string类型的对象,两者的初始化肯定不一样,两者的打印输出方式,两者的比较运算方式肯定都不一样等等,因此对于每一种类型对象来说都要有一个PyTypeObject对象保存与这个类型相关的一些数据成员和函数指针.并且每个类型对象在初始的时候都会初始化PyTypeObject对象,类型信息就固定下来了.具体细节可以参考附录中关于如何自定义新的类型对象.不知道上面说了这么一大通的理论大家是否理解了PyTypeObject的用途? 下面从Python层面我们来看看PyTypeObject的用途.

>>> a = 1
>>> print a
>>> sa = "zhang"
>>> print sa

上面简单的初始化了一个int对象和一个string对象,那么在初始化的时候malloc应该分配多大的空间呢?,这个信息其实存放在PyTypeObject中,print打印这两个对象的是如何知道怎么打印的呢?因为在C语言层面打印一个字符串和打印一个整数是不一样的,那么对于每种类型该如何打印输出也是存放在PyTypeObject中的.就拿int类型的对象来说它的大小放在PyTypeObject对象的tp_basicsize数据成员中,可以通过int对PyTypeObject初始化的代码中看到.

typedef struct _typeobject {
    PyObject_VAR_HEAD
    const char *tp_name; /* For printing, in format "<module>.<name>" */                                                                                                  
    Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
    ......  //此处省略N多成员
    printfunc tp_print; //用于输出类型对象的值
    ......
}PyTypeObject;

./Include/object.h

int对象的PyTypeObject初始化

PyTypeObject PyInt_Type =
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值