开发,设计,生活

编程语言

  • 2014-07-02 05:25:27 2014-07-07 15:52:24[U] 编程语言

    源代码主要目录结构

    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__ 初始化构造函数)