四时宝库

程序员的知识宝库

Python语言中的对象概述是怎样的?

在 Python 的世界中,全部皆目标。 int / list / dict / ... 都是目标,除此之外,函数、类自身也是目标,那么,这些目标终究是什么呢?

从成果看,Python 中的目标是 C 语言中构造体在堆上申请的一片内存区域。而在详细完成上,这儿先简略描绘一下。

万物基于 MIUI: PyObject

想要一起学习交流想要共同进步的可以加python爬虫学习群399288541,群里有许多学习资料等待着大家

在 Python 中,一切目标都共有一些特性,这些特性界说在 PyObject 中。PyObject 界说在 Include/object.h 中:

#define PyObject_HEAD \

简化后即为:

typedef struct _object {

在 PyObject 中,ob_refcnt 用以记载目标的引证数(与引证计数的内存收回有关,这儿暂且不表),当有新的指针指向某目标时,ob_refcnt 的值加 1, 当指向某目标的指针删去时,ob_refcnt 的值减 1,当其值为零的时分,则能够将该目标从堆中删去(事实上并不会当即删去,这儿暂且不表)。除了 ob_refcnt 之外,还有一个 指向 _typeobject 指针ob_type。这个构造体用于表明目标类型。越过 _typeobject,能够发现, Python 目标的中心在于一个引证计数和一个类型信息。

PyObject 界说的内容会出如今每个目标所占内存的开端有些。

定长目标与变长目标

在 Python 中,除了 bool float 这么的定长目标(一旦断定下来需求的内存,便不再有改动),还有另外一种目标:长度可变的目标。这种目标在 Python 的完成中经过 PyVarObject 构造体来表明:

#define PyObject_VAR_HEAD \

事实上,即是在 PyObject 的基础上,多了一个 ob_size 变量,用以标识目标的长度(是长度,不是内存占用)。也即是说,本来 PyVarObject 即是 PyObject 的一个拓宽,所以,在 Python 中,一切的目标都能够经过 PyObject * 指针来引证,这一点非常重要,它使得许多操作变得一致(这篇博客暂不胪陈)。

想要一起学习交流想要共同进步的可以加python爬虫学习群399288541,群里有许多学习资料等待着大家

由此,Python 中一切目标在完成的时分,内存无非如下两种状况:

 定长目标 变长目标

道生一: PyTypeObject

在描绘 PyObject 的时分,提到了一个 _typeobject 构造体。那么,它是干什么的呢?幻想一下,一个目标在创立的时分需求多少内存、这个目标的类名是什么等等信息,又是怎么记载和区别的呢?

_typeobject(也即是PyTypeObject)能够被称之为“指定目标类型的类型目标”,其界说如下:

typedef struct _typeobject {

能够理解为,PyTypeObject 目标是 Python 中面向目标理念中“类”这个概念的完成,这儿仅仅简略介绍其界说中的有些内容:

  • ty_name:类型名

  • tp_basicsize, tp_itemsize:创立类型目标时分配的内存大小信息

  • 被省掉掉的有些:与该类型相关的操作(函数指针)

这儿仅仅简略描绘,上面的内容有些偏颇,暂不用过分深究。

再看一眼 PyTypeObject 的界说,能够发如今最开端也有一个 PyObject_VAR_HEAD,这意味着它也是一个目标。那么,PyTypeObject 既然是指示类型的目标,那么它的类型又是什么呢?答案是 PyType_Type:

PyTypeObject PyType_Type = {

事实上,它即是 Python 语言中的 type 目标即是 PyType_Type,它是一切 class 的 class,在 Python 中叫做 metaclass。本来,在完成中它的 ob_type 指针又指向了自己自身,既是:

 PyType_Type

小结:

简略概述了 Python 中的目标的最含糊的概念。

想要一起学习交流想要共同进步的可以加python爬虫学习群399288541,群里有许多学习资料等待着大家

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接