在 Python 的世界中,一切皆对象。int/list/dict / … 都是对象,除此之外,函数、类本身也是对象,那么,这些对象究竟是什么呢?
注 : 要是看不懂, 直接跳转到最后。

从结果看,Python 中的对象是 C 语言中结构体在堆上申请的一片内存区域。而在具体实现上,这里先简单描述一下。

万物基于 MIUI: PyObject

在 Python 中,所有对象都共有一些特性,这些特性定义在PyObject 中。PyObject定义在Include/object.h中:

#define PyObject_HEAD                   \_PyObject_HEAD_EXTRA                \Py_ssize_t ob_refcnt;               \struct _typeobject *ob_type;typedef struct _object {PyObject_HEAD
} PyObject;

简化后即为:

typedef struct _object {int ob_refcnt;               struct _typeobject *ob_type;
} PyObject;

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_HEAD                       \Py_ssize_t ob_size; /* Number of items in variable part */typedef struct {PyObject_VAR_HEAD
} PyVarObject;

由此,Python 中所有对象在实现的时候,内存无非如下两种情况:

   定长对象              变长对象
+-----------+       +-----------+
| ob_refcnt |       | ob_refcnt |
+-----------+       +-----------+
|  ob_type  |       |  ob_type  |
+-----------+       +-----------+
|           |       |  ob_size  |
|           |       +-----------+
|   other   |       |           |
|           |       |   other   |
|           |       |           |
+-----------+       +-----------+

道生一:PyTypeObject

在描述 PyObject的时候,提到了一个 _typeobject结构体。那么,它是干什么的呢?想象一下,一个对象在创建的时候需要多少内存、这个对象的类名是什么等等信息,又是如何记录和区分的呢?

_typeobject(也就是PyTypeObject)可以被称之为“指定对象类型的类型对象”,其定义如下:

typedef struct _typeobject {PyObject_VAR_HEADconst char *tp_name; /* For printing, in format "<module>.<name>" */Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */// ...... 省略部分暂时不关心的内容} PyTypeObject;

可以理解为,PyTypeObject 对象是 Python 中面向对象理念中“类”这个概念的实现,这里只是简单介绍其定义中的部分内容:

  • ty_name:类型名
  • tp_basicsize, tp_itemsize:创建类型对象时分配的内存大小信息
  • 被省略掉的部分:与该类型关联的操作(函数指针)
    这里只是简单描述,上面的内容有些偏颇,暂不必过分深究。

再看一眼 PyTypeObject的定义,可以发现在最开始也有一个 PyObject_VAR_HEAD,这意味着它也是一个对象。那么,PyTypeObject 既然是指示类型的对象,那么它的类型又是什么呢?答案是PyType_Type

PyTypeObject PyType_Type = {PyVarObject_HEAD_INIT(&PyType_Type, 0)"type",                                     /* tp_name */sizeof(PyHeapTypeObject),                   /* tp_basicsize */sizeof(PyMemberDef),                        /* tp_itemsize */(destructor)type_dealloc,                   /* tp_dealloc */// ...... 省略了部分内容
};

事实上,它就是 Python 语言中的type 对象就是 PyType_Type,它是所有classclass,在 Python 中叫做 metaclass。其实,在实现中它的 ob_type 指针又指向了自己本身,既是:

   PyType_Type
+-----------+<-------+
| ob_refcnt |        |
+-----------+        |
|  ob_size  +--------+
+-----------+
|           |
|   other   |
|           |
+-----------+

小结

简单概述了 Python 中的对象的最模糊的概念。

要是看不懂的小伙伴。 可以加我的学习交流群: 725479218。 直播、交流、书籍、练习题(群文件)。都有。或者关注我一直在学习的龚总好「CoXie带你学编程」(id:Pythoni521)
看得懂的小伙伴可以在后方评论。

万物皆对象,Python的对象概述(简述)相关推荐

  1. python 打印列表对象,python – 打印对象列表

    我是一个 Python新手.我有这个小问题.我想打印一个对象列表,但它打印的是对象的一些奇怪的内部表示.我甚至定义了__str__方法,但我仍然得到这个奇怪的输出.我在这里错过了什么? class p ...

  2. python文件对象

    文件系统和文件 非序列化数据是不能简单地存储到系统文件当中的. linux文件系统的体系结构: python 文件对象 python 文件对象这种文件可以使非目录以外的其他的非常规文件,如管道文件,套 ...

  3. python一切皆对象的理解_在 Python 中万物皆对象

    在 Python 中一切都是对象,并且几乎一切都有属性和方法.所有的函数都有一个内置的 __doc__ 属性,它会返回在函数源代码中定义的 doc string:sys 模块是一个对象,它有一个叫作 ...

  4. Python 对象的身份迷思:从全体公民到万物皆数

    作者 | 豌豆花下猫 责编 | 胡巍巍 这篇文章里即将说出来的东西,也许你本以为知道了,或者你本以为很熟悉,但是,经过我的分析,我相信你会得到不一样的感悟,从此以后,你对Python的理解也会更深一步 ...

  5. Python源码解读之一 万物皆对象(上)

    万物皆对象 初探对象 Python中一切皆对象,在Python的世界里面,所有东西都是对象.整型.字符串.字典.int.str.list.class自定义类都是对象. 像int.str.list等基本 ...

  6. JS入门篇-万物皆对象

    万物即是对象,这是我看<悟透javascript>第一部分最强烈的印象.接下来我来理一下书中第一部分的脉络. 书中告诉我们,在编程的世界里就是数据和实现的逻辑,接下来讲了在JS中,万物皆是 ...

  7. javascript”面向对象编程”- 1万物皆对象

    javascript几乎成了如今web开发人员必学必会的一门语言,但很多人却只停在了一些表单验证等基础操作层面上,在面向对象语言大行其道的当下,我们需要去学习javascript的面向对象的知识,以便 ...

  8. python object类_Python中一切皆对象,这个对象究竟是什么?

    点击上方蓝字CGRnDStudio关注我们" CG TD编程技术相关领域自媒体 " 作者:古明地盆 https://www.cnblogs.com/traditional/p/13 ...

  9. 理解“万事万物皆对象”

    什么是对象? 对象(Object)是一个应用系统中的用来描述客观事物的实体,是有特定属性和行为(方法)的基本运行单位.是类的一个特殊状态下的实例.对象可以是一个实体.一个名词.一个可以想象为有自己标识 ...

最新文章

  1. ZedGraph在项目中的应用
  2. 智能车竞赛技术报告 | 智能车视觉 - 中南大学 - 中南大学比亚迪午马2021
  3. mysql创建反弹函数,MySql创建函数
  4. VR来了,3D人脸重建跟上《三维人脸重建-3DMM》
  5. C#LeetCode刷题-广度优先搜索
  6. C++字符串的不同存放类型 (string/char[])
  7. 下一代微服务Service Mesh原理及实践
  8. struts2 mysql配置文件路径_Struts2(四)Struts2配置文件的配置
  9. centos7 mysql
  10. 智能电动汽车充电桩去除安全隐患提高充电效率
  11. 找出回文字符串用c语言写,寻找回文字符串
  12. 怎么将几张pdf合并成一张_Adobe Acrobat怎么将多个PDF文件合并成一个pdf页面?
  13. win10系统安装win10虚拟机连接局域网
  14. Error: Getter not found: 'suspending'. case AppLifecycleState.suspending
  15. python信用卡客户_银行信用卡客户价值分析(Python数据分析)
  16. html图片滤色,CSS3图片混合(Blend)效果详解
  17. 十七届智能车智能视觉组
  18. 原生js实现贪食蛇小游戏
  19. ubuntu系统安装时的分区方案
  20. hald进程 linux,centos hald 进程详解

热门文章

  1. 2021金融保险行业数据泄露大事件
  2. python音频 降噪_Python | 简单的扩音,音频去噪,静音剪切
  3. GPU和cuda的区别
  4. 跟踪HTTP通道流程分析网络安全隐患
  5. 货币增发为什么会造成通货膨胀? 如何造成
  6. python 语法基础篇
  7. 聊聊RESTful - 科普篇
  8. 法规标准-ISO 22839标准解读(2013版)
  9. 理解对数——金融问题中的自然对数(以e为底的对数)
  10. 文字转载-《 我忍你,一辈子》