zg手册 之 python2.7.7源码分析(1)-- python中的对象
為什么80%的碼農都做不了架構師?>>> ??
源代碼主要目錄結構
Demo: python 的示例程序
Doc: 文檔
Grammar: 用BNF的語法定義了Python的全部語法,提供給解析器使用
Include: 頭文件,在用c/c++編寫擴展模塊時使用
Lib: Python自帶的標準庫,用python編寫的
Modules: 用c編寫的內建模塊的實現,zlib,md5 等
Objects: 內建對象類型的實現 list,dict 等
PC: ? ? ?windows 平臺相關文件
PCbuild: Microsoft Visual C++ 項目工程目錄
Parser: ?對 Python 代碼進行詞法分析和語法分析的代碼
Python: ?字節碼編譯器和解釋器
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_HEADlong?ob_ival; }?PyIntObject;類型對象
在PyObject 的類型對象中(struct _typeobject *ob_type;),有關于類型的名稱,內存占用大小,構造,析構函數指針等屬性。這些是創建對象所需要的信息。
//?類型對象定義代碼片段 typedef?struct?_typeobject?{PyObject_VAR_HEADconst?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'?*/所有類型對象,自定義類對象的類型都是 PyType_Type(python內置的 type 類型),PyType_Type 本身也是一個對象。
上面的 PyBaseObject_Type 類對象是所有其他類的基類(python中內置的 object 類型)。PyBaseObject_Type 本身也是一個對象。
數值/序列/關聯對象的操作方法集合,定義了對象具有這三種對象的操作方法(如數值對象也可以有 []取值操作)。
對象的創建
類型對象在腳本被執行的時候創建,并且添加到符號表。在需要創建類對象的實例時,從符號表中獲取類型對象,并創建它的實例(在 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):passobjTest?=?Test()PyObject_Call 函數被調用,參數是 Test 類對象
因為繼承自 object, 根據類型對象的類型調用 object類型的 tp_call
tp_call 調用 tp_new,tp_init(對應 python類的 __init__ 初始化構造函數)。
原文鏈接: zg手冊 之 python2.7.7源碼分析(1)-- python中的對象
轉載于:https://my.oschina.net/hopez/blog/288390
總結
以上是生活随笔為你收集整理的zg手册 之 python2.7.7源码分析(1)-- python中的对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Exchange Server2013
- 下一篇: 解决Delphi7的自带的UTF-8编码