python学习(一)

       很久以前就开始有了学习python的打算,在看了黑客与画家又搞定了实习以后,还是决定静下心来琢磨琢磨它了,看了“python学习手册”整了点基础知识,还是打算从python的底层实现学习,同时也可复习复习编译原理和C,,在官网python.org下载份源码,下了2.7的,因为看介绍说3.0和2.0的功能上有一些比较明显的差别,比如说类继承树的查找方式,一些运算的处理,还是决定整2.7的版本,在下载的源码中有一个PCbuild目录,里面有vs的工程文件,在vs中导入工程就可以编译了,后续研究的时候可以通过修改其中相关的代码来观察效果,具体的配置过程可参考网上教程。
       在python中可以说一切都是对象,最基本的是PyObject,在object.h中可以看到这些基本数据结构的定义,
#define PyObject_HEAD                   \
    _PyObject_HEAD_EXTRA                \
    Py_ssize_t ob_refcnt;               \
    struct _typeobject *ob_type;

typedef struct _object {
    PyObject_HEAD
} PyObject;
       PyObject可以说是所有其它对象类型的根对象,其中的ob_refcnt存储对象的引用次数,而ob_type则存储对象的类型,引用次数涉及了python的垃圾回收机制,跟java一样,当引用次数为0时,则回收对象的内存空间。至于ob_type的作用,我们知道在python中,变量是没有类型的,变量引用的对象才有类型,比如b=3;这里b是变量,其中没有类型信息,类型信息在其其对应的int对象——3中,这跟以前对java,c,c++等语言认知不太一样,在这些语言中变量具有其类型信息。这个特性也构成了python的多态机制的基础,变量中没有类型信息,所以可以给其任意赋值,知道运行时,python才确定其引用的对象类型。
       从内置类型intobject可以看出一些端倪,PyIntObject为:
typedef struct {
    PyObject_HEAD
    long ob_ival;
} PyIntObject;
        其类型对象:
PyTypeObject PyInt_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "int",
    sizeof(PyIntObject),
    0,
    (destructor)int_dealloc,                    /* tp_dealloc */
    (printfunc)int_print,                       /* tp_print */
    0,                                          /* tp_getattr */
    0,                                          /* tp_setattr */
    (cmpfunc)int_compare,                       /* tp_compare */
    (reprfunc)int_to_decimal_string,            /* tp_repr */
    &int_as_number,                             /* tp_as_number */
    0,                                          /* tp_as_sequence */
    0,                                          /* tp_as_mapping */
    (hashfunc)int_hash,                         /* tp_hash */
    0,                                          /* tp_call */
    (reprfunc)int_to_decimal_string,            /* tp_str */
    PyObject_GenericGetAttr,                    /* tp_getattro */
    0,                                          /* tp_setattro */
    0,                                          /* tp_as_buffer */
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
        Py_TPFLAGS_BASETYPE | Py_TPFLAGS_INT_SUBCLASS,          /* tp_flags */
    int_doc,                                    /* tp_doc */
    0,                                          /* tp_traverse */
    0,                                          /* tp_clear */
    0,                                          /* tp_richcompare */
    0,                                          /* tp_weaklistoffset */
    0,                                          /* tp_iter */
    0,                                          /* tp_iternext */
    int_methods,                                /* tp_methods */
    0,                                          /* tp_members */
    int_getset,                                 /* tp_getset */
    0,                                          /* tp_base */
    0,                                          /* tp_dict */
    0,                                          /* tp_descr_get */
    0,                                          /* tp_descr_set */
    0,                                          /* tp_dictoffset */
    0,                                          /* tp_init */
    0,                                          /* tp_alloc */
    int_new,                                    /* tp_new */
    (freefunc)int_free,                         /* tp_free */
};

       从每个属性对应的注释大概可以知道它们的作用,需要理解的几个属性是, PyVarObject_HEAD_INIT(&PyType_Type, 0),这个说明作为int的类型对象其也是有类型的……这听起来有点拗口,好吧=。=!其实就是因为在python底层的实现中需要判断一个对象的类型属于哪一类,是int还是string,还是啥啥!好吧,我也被绕进去了……算了就这样吧!!!紧接着就是int对象类型的名字,后面有一个 int_as_number,这是一个方法数组,其中定义了在int类型上可以进行的操作,像加减乘除这些,当你在python执行了对应的操作时,就会调用这里的函数完成功能。紧跟着这个参数的还有定义与序列和字典的操作集, PyTypeObject结构的定义在object.h中,可具体参照。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值