[python]源码:对象

转载 2016年06月02日 07:50:12

PYTHON 源码阅读 - 对象

结束休息期, 开始准备面试事宜了, 发现要准备的东西好多(╯‵□′)╯︵┻━┻, 顺手整理下Python源码阅读笔记(力争在写完前找到工作)

参考内容: Python源码 + <<Python源码剖析>>

源代码+说明+图解的方式, 尽量说明白吧, 有一份注释在github上

内容:

-> 对象/类型
-> 各种内建类型对象及机制
-> 虚拟机相关(编译及执行)
-> 内存管理/动态加载/多线程等

PS: 画图的话google doc很好用

好的, 第一篇开始


一切皆为对象

对象, 在C语言是如何实现的?

Python中对象分为两类: 定长(int等), 非定长(list/dict等)

所有对象都有一些相同的东西, 源码中定义为PyObjectPyVarObject, 两个定义都有一个共同的头部定义PyObject_HEAD(其实PyVarObject有自己的头部定义PyObject_VAR_HEAD, 但其实际上用的也是PyObject_HEAD).

源码位置: Include/object.h

PyObject_HEAD

Python 内部, 每个对象拥有相同的头部.

定义

/* PyObject_HEAD defines the initial segment of every PyObject. */
#define PyObject_HEAD                   \
    _PyObject_HEAD_EXTRA                \
    Py_ssize_t ob_refcnt;               \
    struct _typeobject *ob_type;

说明

1. _PyObject_HEAD_EXTRA
先忽略, 双向链表结构, 后面垃圾回收再说

2. Py_ssize_t ob_refcnt
Py_ssize_t在编译时确定, 整型
ob_refcnt, 引用计数, 跟Python的内存管理机制相关(基于引用计数的垃圾回收)

3. struct _typeobject *ob_type
*ob_type 指向类型对象的指针(指向_typeobject结构体)
决定了这个对象的类型!

PyObject

定义

 typedef struct _object {
     PyObject_HEAD
 } PyObject;

说明

 1. 依赖关系
 PyObject -> PyObject_HEAD

结构

PyObject

PyVarObject

定义

typedef struct {
    PyObject_VAR_HEAD
} PyVarObject;

#define PyObject_VAR_HEAD               \
  PyObject_HEAD                       \
  Py_ssize_t ob_size; /* Number of items in variable part */

说明

 1. 依赖关系
 PyVarObject -> PyObject_VAR_HEAD -> PyObject_HEAD

 2.Py_ssize_t ob_size
 ob_size, 变长对象容纳的元素个数

结构

PyVarObject

代码关系

PyObjectCode

几个方法

跟对象相关的方法

#define Py_REFCNT(ob)           (((PyObject*)(ob))->ob_refcnt)
读取引用计数

#define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)
获取对象类型

#define Py_SIZE(ob)             (((PyVarObject*)(ob))->ob_size)
读取元素个数(len)

跟引用计数相关的方法

Py_INCREF(op)  增加对象引用计数

Py_DECREF(op)  减少对象引用计数, 如果计数位0, 调用_Py_Dealloc

_Py_Dealloc(op) 调用对应类型的 tp_dealloc 方法(每种类型回收行为不一样的, 各种缓存池机制, 后面看)

其他

几个参数涉及

ob_refcnt 引用计数, 与内存管理/垃圾回收相关
ob_type   类型, 涉及Python的类型系统

changelog:

2013-08-05 first version

使用Python生成源文件的两种方法

利用Python的字符串处理模块,开发人员可以编写脚本用来生成那些格式相同的C、C++、JAVA源程序、头文件和测试文件,从而避免大量的重复工作。本文概述两种利用Python string类生成jav...
  • suipingsp
  • suipingsp
  • 2014年09月18日 12:48
  • 2488

分享网上找到的一个中国象棋源码

分享网上找到的一个中国象棋源码
  • yaerfeng
  • yaerfeng
  • 2014年02月24日 10:10
  • 10885

Python面向对象编程指南

虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程。下面就来了解一下如何在Python中进行对象编程。 一.如何定义一个类   在进行python面向对象编程之前,先来了解几个术语...
  • zhoudaxia
  • zhoudaxia
  • 2014年04月16日 14:30
  • 13245

《Python源码剖析》阅读笔记:第四章-list对象

第四章-list对象  list对象定义: typedef struct { PyObject_VAR_HEAD PyObject **ob_item; Py_ssize_t alloc...
  • digimon
  • digimon
  • 2012年08月17日 09:13
  • 2840

《Python源码剖析》阅读笔记:第五章-dict对象

第五章-dict对象  Python里的dict和C++ STL的map一样,都是映射容器(key->value),但实现原理不同。由于Python内部大量使用dict这种结构(比如字符串对象的...
  • digimon
  • digimon
  • 2012年08月17日 09:15
  • 4587

深入源码解析Python中的对象与类型

http://www.jb51.net/article/76269.htm 对象 对象, 在C语言是如何实现的? Python中对象分为两类: 定长(int等), 非定长(list/...
  • happyjxt
  • happyjxt
  • 2016年01月01日 13:51
  • 246

《Python源码剖析》阅读笔记:第三章-字符串对象

第三章-字符串对象  字符串对象定义: typedef struct { PyObject_VAR_HEAD long ob_shash; int ob_sstate; char ob...
  • digimon
  • digimon
  • 2012年08月17日 09:12
  • 2032

深入学习Django源码基础3 - python提供的对象默认方法

详细内容看这里A Guide to Python's Magic Methods 这里也有1篇中文的翻译部分https://pycoders-weekly-chinese.readthedocs.or...
  • watsy
  • watsy
  • 2013年08月31日 15:20
  • 1386

python源码分析----对象结构

在python中,所有的东西都是对象,整数是,方法也是,。。总之什么都是。。。。 在看python的代码实现中,可以随处看到指针类型:PyObject*,那么我们就先来看看PyObject这到底是怎么...
  • fjs_cloud
  • fjs_cloud
  • 2015年05月18日 12:51
  • 918

Python源码学习笔记 2 整数对象

Python中的整数类型是不可变对象,为了提高python运行效率,内部实现了小整数对象池(数组实现),和普通整数缓冲池(单链表实现)。1.PyIntObject 该结构仅适用2.5版本,该版本下...
  • openex
  • openex
  • 2017年04月11日 00:13
  • 179
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[python]源码:对象
举报原因:
原因补充:

(最多只允许输入30个字)