本系列文章都是基于陈儒的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相关推荐

  1. python对象底层原理_Python字符串对象实现原理详解

    在Python世界中将对象分为两种:一种是定长对象,比如整数,整数对象定义的时候就能确定它所占用的内存空间大小,另一种是变长对象,在对象定义时并不知道是多少,比如:str,list, set, dic ...

  2. python对象内存模型

    原文:Python的垃圾回收机制(二)之内存模型 1. Python对象内存模型 首先介绍一下Python对象的内存模型,如下图1所示: 图1. PyObject对象内存模型 上图可以看到,一个PyO ...

  3. python将一个json字典转换为一个python对象

    python将一个json字典转换为一个python对象 示例代码: from collections import OrderedDict import jsondata = '{"nam ...

  4. python numpy 数据类型为python对象-python numPy模块 与numpy里的数据类型、数据类型对象dtype...

    学习链接:http://www.runoob.com/numpy/numpy-tutorial.html 简介: numPy是python语言的一个扩展库,是一个运行非常快的数学库,主要用于数组计算. ...

  5. Python pickle模块:实现Python对象的持久化存储

    Python 中有个序列化过程叫作 pickle,它能够实现任意对象与文本之间的相互转化,也可以实现任意对象与二进制之间的相互转化.也就是说,pickle 可以实现 Python 对象的存储及恢复. ...

  6. Python3中的json对象与python对象转化

    1.直接将Python对象转成json对象,使用方法dumps() import jsond = {"姓名": "curry", "age" ...

  7. 独家|测量、建议、快速上手!你所使用的Python对象占用了多少内存?(附代码)...

    作者:Gigi Sayfan 翻译:吴振东 校对:吴金笛 本文约3300字,建议阅读10分钟. 本文将介绍多种Python对象分别所占用的内存,并解释所选择的测量方法和函数,为节省内存提供建议. Py ...

  8. python 对象类型有哪些?

    python 强大的内置类型让我接触到python的时候开始慢慢的喜欢上它了,感觉既方便又好用,下面我们先一起学习下内置对象类型的好处: 1内置对象能够使得我们编写程序更容易. 2内置的对象效率更高, ...

  9. python对象一定要删除引用吗_在Python中删除一个对象和所有对它的引用?

    如果我理解正确,你将包装一些C代码,并且C代码有一个可以被调用的析构函数.之后,任何使用指向C代码对象的指针的尝试都会导致致命的崩溃. 我不确定你的具体情况,所以我将给你两个替代答案. 0)如果C对象 ...

最新文章

  1. ios5 中文键盘高度变高覆盖现有ui问题的解决方案(获取键盘高度的方法)
  2. iPhone上将短信内容发送到指定邮箱的方法
  3. ArcEngine开发体验(附许可)
  4. linux shell脚本 删除指定目录下文件夹(可指定文件夹名、时间)
  5. tensorflow 学习资料汇总
  6. 用MATLAB玩转机器人-第1章 认识MATLAB
  7. OC_UISlider
  8. 微信/抖音商城小程序源码开源版(下载)
  9. 系统繁忙 请稍后再试(ALI64)”
  10. WOS(SCI)爬虫:风车WOS下载器
  11. 电脑文件管理,教你一键将大量文件夹名称翻译成英文
  12. 【python】hasattr()、getattr()、setattr() 函数使用详解
  13. echart地图隐藏南海诸岛
  14. L1 Cache(一级缓存)
  15. Google 工程师二三事
  16. 2-10偶数乘2奇数乘3
  17. 在网页上加QQ,MSN,skype,goolge TALK,雅虎通,贸易通,淘宝旺旺在线客服代码
  18. 怎么把科学计算机的fix弄掉,如何消除计算器上的FIX功能
  19. mysql中查询的第一名_使用SQL查询每科第一名及最后一名(学科、姓名、分数)...
  20. Anaconda 安装教程

热门文章

  1. 通信录的设计(java)
  2. Cisco 与 Intel路由器的对连配置实例
  3. 企业网站SEO优化怎样做效果更好
  4. 我的下一步的计算机学习计划
  5. [亲测有效]win10如何快速有效的去除快捷方式箭头
  6. DC-DC产生负电压
  7. 算法分析与作业7投资问题
  8. 订阅Linux kernel邮件及可能遇到的问题
  9. 测试:使用高德地图把经纬度转为商圈
  10. 写字楼空间装修的设计与听觉