您的当前位置:首页正文

Python类型对象理解

来源:花图问答

之前的PyObject中我们看到了ob_type,而上一篇文章中举过了PyBaseObject_Type的例子,这一次,要介绍一下PyTypeObject以及PyType_Type

每一个PyTypeObject中都储存了PyObject中所需要的各种各样的信息,主要分为四类(借用一下《Python源码分析》中的话):

  • 类型名:tp_name
  • 创建该类型对象时分配内存空间大小的信息
  • 与该类型对象相关的操作信息
  • PyType_Type

每一个对象都会有它对应的类型对象的指针,比如一个PyLongObject它指向的类型对象是PyLong_Type,一个PyDictObject指向的类型对象是PyDict_Type

但是这是我们就会有疑问,类型对象也是对象,按照之前所说,对象最基本的模板就是PyObject,所以PyLong_TypePyDict_Type这些类型对象也应该有对应的类型对象,它们的类型对象是谁呢?

其实就是之前所说的PyType_Type,当然,这个东西没有特别神奇,和PyBaseObject_Type它们其实都是一个具体的PyTypeObject,只是描述的东西有所不同

它们内部很多内容都是要和其它东西扯上关系的,强行看只会让自己很痛苦,现在重点是对它们有所理解

下面是我的理解,仅作参考,如果,大家对此有什么理解,也可以在下面说出来大家一起看


我的理解

最开始介绍的是PyObject,它是一个结构体,它就像int、long这样的类型或者我们常说的面向对象中的类一样,我最初的理解就是把它看作一个类,一个对象的模板,一个对象的类型,就如同我们常说123是整型一样

但是突然出现一个PyLong_Type这样的东西,它是PyLongObject的类型对象,突然让我混乱了起来

查看PyLong_Type的内容的时候看到很多函数指针,这时候我突然就想结构体里面只要有数据以及函数指针,那不就是一个类了吗,然后就它的结构体变量就是我们的对象了,那么出现PyLong_Type到底有何用?

然而,到了看Python源码的时候,我却像是忘了这个东西,其实,PyLong_Type不就是我所谓的那个类吗,它有着各种各样的函数指针,不就是这个类的方法么,PyObject不就是我所谓的真正的对象的模板吗,它有的仅仅应该是属于自己的数据(那个引用数据),当然还得有它对应的那个‘类’的指针,只有PyObjectPyLong_Type放在一块,才是我们写在代码中的那个类

所以我们新建对象的时候,在C的层面,其实是根据PyObject这个数据部分的模板建,然后给他一个类型对象,这个对象有着各种各种函数的指针,所以它其实应该是一个结构体变量,而它对应的结构体PyTypeObject(它也是PyObject扩展而来),

PyTypeObject的各种变量就是我们的类型对象,它们对应的类型对是PyType_Type(类型的类型),PyType_Type也是类型对象,它对应的类型对象就是它自己,所以这个体系就彻底建立完毕了


欢迎在下方谈自己的理解