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到底有何用?

在以前学了部分Java的时候,我认为的是像方法像static变量一样,应该是类所拥有的特性,之后也知道执行的时候方法有个隐形的参数就是对象本身,这样我感觉我的想法更对了,方法就该一个类去拥有的,而不是每个对象都已自己的一份,只有数据,每个对象才有其特有的一份,为了验证,我看到一篇博客,说的更形象一点:Java 对象在堆中的内存结构

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

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

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


欢迎大家在下方谈自己的理解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容