歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Python2.7.7源碼分析

Python2.7.7源碼分析

日期:2017/3/1 9:26:40   编辑:Linux編程

眾所周知,直接訪問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

Copyright © Linux教程網 All Rights Reserved