万物皆对象,Python的对象概述(简述)
在 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
,它是所有class
的 class
,在 Python 中叫做 metaclass
。其实,在实现中它的 ob_type
指针又指向了自己本身,既是:
PyType_Type
+-----------+<-------+
| ob_refcnt | |
+-----------+ |
| ob_size +--------+
+-----------+
| |
| other |
| |
+-----------+
小结
简单概述了 Python 中的对象的最模糊的概念。
要是看不懂的小伙伴。 可以加我的学习交流群: 725479218。 直播、交流、书籍、练习题(群文件)。都有。或者关注我一直在学习的龚总好「CoXie带你学编程」(id:Pythoni521)
看得懂的小伙伴可以在后方评论。
万物皆对象,Python的对象概述(简述)相关推荐
- python 打印列表对象,python – 打印对象列表
我是一个 Python新手.我有这个小问题.我想打印一个对象列表,但它打印的是对象的一些奇怪的内部表示.我甚至定义了__str__方法,但我仍然得到这个奇怪的输出.我在这里错过了什么? class p ...
- python文件对象
文件系统和文件 非序列化数据是不能简单地存储到系统文件当中的. linux文件系统的体系结构: python 文件对象 python 文件对象这种文件可以使非目录以外的其他的非常规文件,如管道文件,套 ...
- python一切皆对象的理解_在 Python 中万物皆对象
在 Python 中一切都是对象,并且几乎一切都有属性和方法.所有的函数都有一个内置的 __doc__ 属性,它会返回在函数源代码中定义的 doc string:sys 模块是一个对象,它有一个叫作 ...
- Python 对象的身份迷思:从全体公民到万物皆数
作者 | 豌豆花下猫 责编 | 胡巍巍 这篇文章里即将说出来的东西,也许你本以为知道了,或者你本以为很熟悉,但是,经过我的分析,我相信你会得到不一样的感悟,从此以后,你对Python的理解也会更深一步 ...
- Python源码解读之一 万物皆对象(上)
万物皆对象 初探对象 Python中一切皆对象,在Python的世界里面,所有东西都是对象.整型.字符串.字典.int.str.list.class自定义类都是对象. 像int.str.list等基本 ...
- JS入门篇-万物皆对象
万物即是对象,这是我看<悟透javascript>第一部分最强烈的印象.接下来我来理一下书中第一部分的脉络. 书中告诉我们,在编程的世界里就是数据和实现的逻辑,接下来讲了在JS中,万物皆是 ...
- javascript”面向对象编程”- 1万物皆对象
javascript几乎成了如今web开发人员必学必会的一门语言,但很多人却只停在了一些表单验证等基础操作层面上,在面向对象语言大行其道的当下,我们需要去学习javascript的面向对象的知识,以便 ...
- python object类_Python中一切皆对象,这个对象究竟是什么?
点击上方蓝字CGRnDStudio关注我们" CG TD编程技术相关领域自媒体 " 作者:古明地盆 https://www.cnblogs.com/traditional/p/13 ...
- 理解“万事万物皆对象”
什么是对象? 对象(Object)是一个应用系统中的用来描述客观事物的实体,是有特定属性和行为(方法)的基本运行单位.是类的一个特殊状态下的实例.对象可以是一个实体.一个名词.一个可以想象为有自己标识 ...
最新文章
- ZedGraph在项目中的应用
- 智能车竞赛技术报告 | 智能车视觉 - 中南大学 - 中南大学比亚迪午马2021
- mysql创建反弹函数,MySql创建函数
- VR来了,3D人脸重建跟上《三维人脸重建-3DMM》
- C#LeetCode刷题-广度优先搜索
- C++字符串的不同存放类型 (string/char[])
- 下一代微服务Service Mesh原理及实践
- struts2 mysql配置文件路径_Struts2(四)Struts2配置文件的配置
- centos7 mysql
- 智能电动汽车充电桩去除安全隐患提高充电效率
- 找出回文字符串用c语言写,寻找回文字符串
- 怎么将几张pdf合并成一张_Adobe Acrobat怎么将多个PDF文件合并成一个pdf页面?
- win10系统安装win10虚拟机连接局域网
- Error: Getter not found: 'suspending'. case AppLifecycleState.suspending
- python信用卡客户_银行信用卡客户价值分析(Python数据分析)
- html图片滤色,CSS3图片混合(Blend)效果详解
- 十七届智能车智能视觉组
- 原生js实现贪食蛇小游戏
- ubuntu系统安装时的分区方案
- hald进程 linux,centos hald 进程详解