Python 对象的基石 PyObject
本系列文章都是基于陈儒的Python源码剖析一书。
打开object.h 文件
typedef struct _object {PyObject_HEAD
} PyObject;
上述代码定义了一个数据类型PyObject. 可以发现PyObject中就是PyObject_HEAD。
#define PyObject_HEAD \_PyObject_HEAD_EXTRA \Py_ssize_t ob_refcnt; \struct _typeobject *ob_type;
可以发现 PyObject_HEAD 是一个宏定义。其中 _PyObject_HEAD_EXTRA也是一个宏定义。
#ifdef Py_TRACE_REFS
/* Define pointers to support a doubly-linked list of all live heap objects. */
#define _PyObject_HEAD_EXTRA \struct _object *_ob_next; \struct _object *_ob_prev;#define _PyObject_EXTRA_INIT 0, 0,#else
#define _PyObject_HEAD_EXTRA
#define _PyObject_EXTRA_INIT
#endif
在release编译模式下 Py_TRACE_REFS 是没有被定义的。所以根据条件编译的结果来说
_PyObject_HEAD_EXTRA 为空。所以PyObject可以表述为下面形式:
typedef struct _object {Py_ssize_t ob_refcnt; struct _typeobject *ob_type;
} PyObject;
可以认为 ob_refcnt 是一个无符号的整形变量。ob_refcnt和python的垃圾回收相关的,代表了一个python对象被引用的次数。我们知道Python主要的垃圾回收方式是引用计数,当一个对象被引用的次数为0的时候判断这个对象是一个垃圾对象,然后标记这块内存为垃圾,被重复使用。
ob_type 是一个指针指向_typeobject 的数据。_typeobject代表这个python对象的类型,这也是Python实现多态和各种魔法函数的核心所在。在_typeobject中定义了各种函数指针的数组或者单个的函数指针,这些函数指针代表着此类Python对象所实现的Python内建的各种协议。当运行到Python的各种运算的时候触发这些函数的调用。在Python中我们可以认为任何的操作符都是对应着一种函数。
PyObject可以指代任何Python对象,你可能会觉得如果用PyObject指代任何Python对象,那么其他的数据域到什么地方去了。其实这是C语言中使用C语言描述面向对象思想的一种惯用法。头两个字段的大小都是确定的,完全可以获取到这个对象的类型,然后通过类型完全可以获取到这个对象的大小,然后强行的转型就可以变成具体的类型。如果你使用过Java可以认为PyObject是一个抽象类其中具有两个固定的字段,然后和一堆的抽象方法,你完全可以使用Java实现Python的对象模型。
Python 对象的基石 PyObject相关推荐
- python对象底层原理_Python字符串对象实现原理详解
在Python世界中将对象分为两种:一种是定长对象,比如整数,整数对象定义的时候就能确定它所占用的内存空间大小,另一种是变长对象,在对象定义时并不知道是多少,比如:str,list, set, dic ...
- python对象内存模型
原文:Python的垃圾回收机制(二)之内存模型 1. Python对象内存模型 首先介绍一下Python对象的内存模型,如下图1所示: 图1. PyObject对象内存模型 上图可以看到,一个PyO ...
- python将一个json字典转换为一个python对象
python将一个json字典转换为一个python对象 示例代码: from collections import OrderedDict import jsondata = '{"nam ...
- python numpy 数据类型为python对象-python numPy模块 与numpy里的数据类型、数据类型对象dtype...
学习链接:http://www.runoob.com/numpy/numpy-tutorial.html 简介: numPy是python语言的一个扩展库,是一个运行非常快的数学库,主要用于数组计算. ...
- Python pickle模块:实现Python对象的持久化存储
Python 中有个序列化过程叫作 pickle,它能够实现任意对象与文本之间的相互转化,也可以实现任意对象与二进制之间的相互转化.也就是说,pickle 可以实现 Python 对象的存储及恢复. ...
- Python3中的json对象与python对象转化
1.直接将Python对象转成json对象,使用方法dumps() import jsond = {"姓名": "curry", "age" ...
- 独家|测量、建议、快速上手!你所使用的Python对象占用了多少内存?(附代码)...
作者:Gigi Sayfan 翻译:吴振东 校对:吴金笛 本文约3300字,建议阅读10分钟. 本文将介绍多种Python对象分别所占用的内存,并解释所选择的测量方法和函数,为节省内存提供建议. Py ...
- python 对象类型有哪些?
python 强大的内置类型让我接触到python的时候开始慢慢的喜欢上它了,感觉既方便又好用,下面我们先一起学习下内置对象类型的好处: 1内置对象能够使得我们编写程序更容易. 2内置的对象效率更高, ...
- python对象一定要删除引用吗_在Python中删除一个对象和所有对它的引用?
如果我理解正确,你将包装一些C代码,并且C代码有一个可以被调用的析构函数.之后,任何使用指向C代码对象的指针的尝试都会导致致命的崩溃. 我不确定你的具体情况,所以我将给你两个替代答案. 0)如果C对象 ...
最新文章
- ios5 中文键盘高度变高覆盖现有ui问题的解决方案(获取键盘高度的方法)
- iPhone上将短信内容发送到指定邮箱的方法
- ArcEngine开发体验(附许可)
- linux shell脚本 删除指定目录下文件夹(可指定文件夹名、时间)
- tensorflow 学习资料汇总
- 用MATLAB玩转机器人-第1章 认识MATLAB
- OC_UISlider
- 微信/抖音商城小程序源码开源版(下载)
- 系统繁忙 请稍后再试(ALI64)”
- WOS(SCI)爬虫:风车WOS下载器
- 电脑文件管理,教你一键将大量文件夹名称翻译成英文
- 【python】hasattr()、getattr()、setattr() 函数使用详解
- echart地图隐藏南海诸岛
- L1 Cache(一级缓存)
- Google 工程师二三事
- 2-10偶数乘2奇数乘3
- 在网页上加QQ,MSN,skype,goolge TALK,雅虎通,贸易通,淘宝旺旺在线客服代码
- 怎么把科学计算机的fix弄掉,如何消除计算器上的FIX功能
- mysql中查询的第一名_使用SQL查询每科第一名及最后一名(学科、姓名、分数)...
- Anaconda 安装教程