手机版
你好,游客 登录 注册
背景:
阅读新闻

Python2.7.7源码分析

Python中的对象

[日期:2015-08-06] 来源:Linux社区  作者:hopez [字体: ]

众所周知,直接访问Python官网非常慢,而且可能有时候根本无法访问。所以,源码直接放在这里便于下载。Python 2.7.7的源码,学习Python的参考素材。tar.xz压缩格式。使用下面这个命令解压缩:
tar -xvf ./Python-2.7.7.tar.xz

------------------------------------------分割线------------------------------------------

FTP地址:ftp://ftp1.linuxidc.com

用户名:ftp1.linuxidc.com

密码:www.linuxidc.com

在 2015年LinuxIDC.com\8月\Python2.7.7源码分析

下载方法见 http://www.linuxidc.com/Linux/2013-10/91140.htm

------------------------------------------分割线------------------------------------------ 

无需操作系统直接运行 Python 代码  http://www.linuxidc.com/Linux/2015-05/117357.htm 

CentOS上源码安装Python3.4  http://www.linuxidc.com/Linux/2015-01/111870.htm 

《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm 

《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码] http://www.linuxidc.com/Linux/2013-11/92693.htm 

Python脚本获取Linux系统信息 http://www.linuxidc.com/Linux/2013-08/88531.htm 

Ubuntu下用Python搭建桌面算法交易研究环境 http://www.linuxidc.com/Linux/2013-11/92534.htm 

Python 语言的发展简史 http://www.linuxidc.com/Linux/2014-09/107206.htm 

源代码主要目录结构

  1. Demo: python 的示例程序
  2. Doc: 文档
  3. Grammar: 用BNF的语法定义了Python的全部语法,提供给解析器使用
  4. Include: 头文件,在用c/c++编写扩展模块时使用
  5. Lib: Python自带的标准库,用python编写的
  6. Modules: 用c编写的内建模块的实现,zlib,md5 等
  7. Objects: 内建对象类型的实现 list,dict 等
  8. PC:      windows 平台相关文件
  9. PCbuild: Microsoft Visual C++ 项目工程目录
  10. Parser:  对 Python 代码进行词法分析和语法分析的代码
  11. Python:  字节码编译器和解释器
  12. Tools:   一些用 Python 开发的工具 

Python 的对象定义和创建

在 Python 中,一切都是对象

Python 中的对象有定长对象PyObject (如 int 对象),变长对象PyVarObject(如 list 对象), Python 的对象都属于这两种之一。对象中包含引用计数和类型信息,管理和创建对象需要用到。还包含属性值的存储空间。

PyObject 对象在内存中的结构类似下面代码:

// 在 Include/object.h 中
// 定长对象
typedef struct _object {
    int ob_refcnt; // 用于内存管理的引用计数
    struct _typeobject *ob_type; // 类型对象,包含类型信息
} PyObject;

// 变长对象
typedef struct {
    int ob_refcnt; // 用于内存管理的引用计数
    struct _typeobject *ob_type; // 类型对象,包含类型信息
    Py_ssize_t ob_size; // 变长对象(容器类: list等)容纳元素的个数
} PyVarObject;

// int 对象
typedef struct {
    PyObject_HEAD
    long ob_ival;
} PyIntObject; 

类型对象

在PyObject 的类型对象中(struct _typeobject *ob_type;),有关于类型的名称,内存占用大小,构造,析构函数指针等属性。这些是创建对象所需要的信息。

// 类型对象定义代码片段
typedef struct _typeobject {
    PyObject_VAR_HEAD
    const char *tp_name; /* 名称, 打印时输出的格式 "<module>.<name>" */
    Py_ssize_t tp_basicsize, tp_itemsize; /* 创建对象时分配的内存空间大小 */

    /* 类型实现的标准方法 */
    destructor tp_dealloc;
    printfunc tp_print;
    getattrfunc tp_getattr;
    setattrfunc tp_setattr;
    cmpfunc tp_compare;
    reprfunc tp_repr;

    /* 数值对象的操作方法集合 */
    PyNumberMethods *tp_as_number;

    /* 序列对象的操作方法集合 */
    PySequenceMethods *tp_as_sequence;

    /* 关联对象的操作方法集合 */
    PyMappingMethods *tp_as_mapping;
// ...
} PyTypeObject;

// python 的类的基本类型,所有类型都应该从这个类型继承
PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */
PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */
PyAPI_DATA(PyTypeObject) PySuper_Type; /* built-in 'super' */

 

  1. 所有类型对象,自定义类对象的类型都是 PyType_Type(python内置的 type 类型),PyType_Type 本身也是一个对象。

  2. 上面的 PyBaseObject_Type 类对象是所有其他类的基类(python中内置的 object 类型)。PyBaseObject_Type 本身也是一个对象。

  3. 数值/序列/关联对象的操作方法集合,定义了对象具有这三种对象的操作方法(如数值对象也可以有 []取值操作)。 

对象的创建

类型对象在脚本被执行的时候创建,并且添加到符号表。在需要创建类对象的实例时,从符号表中获取类型对象,并创建它的实例(在 symtable.c 文件中有相关符号表的代码)。 C api 创建类对象有一套接口:

// 创建一个整型类对象
PyObject* intObj = PyObject_New(PyObject, &PyInt_Type);

PyObject *_PyObject_New(PyTypeObject *tp)
{
    PyObject *op;
    op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp));
    if (op == NULL)
        return PyErr_NoMemory();
    return PyObject_INIT(op, tp);
} 

在 python 中创建对象时,创建过程如下例描述:

class Test(object):
    pass

objTest = Test() 
  1. PyObject_Call 函数被调用,参数是 Test 类对象
  2. 因为继承自 object, 根据类型对象的类型调用 object类型的 tp_call
  3. tp_call 调用 tp_new,tp_init(对应 python类的 __init__ 初始化构造函数)。 

更多详情见请继续阅读下一页的精彩内容http://www.linuxidc.com/Linux/2015-08/121168p2.htm

linux
【内容导航】
第1页:Python中的对象 第2页:Python 的整数对象
第3页:list 对象和 dict 对象 第4页:pyc字节码文件
第5页:Python的作用域和名空间
相关资讯       Python对象  Python2.7.7源码  Python2.7.7