(一)python对象的基本实现
 
      众所周之,python是个极其简洁高效的脚本语言,其设计思维之简洁,编写之简单,已成公认。想着深入了解内部机制,探索一下源代码,并记录一些东西。诚然,人总是健忘的,因而只有不断地写日记和笔记记录自己的想法,我们的有益的想法和生活的点滴才能被永久地保存下来,否者只能在别人思想的轨道上空转,始终成为不了自己的东西。
    当然对于现存的事物,我们最好或者一定要采取critica thingking的态度。准备考试,最大的痛苦就是要照抄全搬,头脑越学越死。当时归根到底我们学习不是为了考试,不是为了分数,更重要的是提高自己的capability。
    python源码的注释很清楚,或者说很人性化,而且事实上也不会出现艰难晦涩的算法,最主要的还是设计的思想和框架。当然宏神马的很讨厌,窜来窜去的...
    学习python的第一步就是要了解其工作机制,下面开始记录:
    所谓对象,实际上是把一块数据集及针对数据的操作当做为一个整体,非常符合人的思维,比如开关灯,灯、开关就是数据,打开开关就是操作。
首先,python都有个根对象即PyObject, 采用引用计数的方式,当ob_refcnt=0时,从堆中删除对象,释放出内存供别的对象使用。对于可变大小的Object称为PyVarObject, 这样的对象通常都是Container, 在PyObject_VAR_HEAD中有个ob_size这个变量,表明有多少个对象在容器中。具体定义如下
 1 [object.h]
 2 #ifdef Py_TRACE_REFS
 3 /* Define pointers to support a doubly-linked list of all live heap objects. */
 4 #define _PyObject_HEAD_EXTRA            \
 5     struct _object *_ob_next;           \
 6     struct _object *_ob_prev;
 7  
 8 #define _PyObject_EXTRA_INIT 0, 0,
 9  
10 #else
11 #define _PyObject_HEAD_EXTRA
12 #define _PyObject_EXTRA_INIT
13 #endif
14  
15 /* PyObject_HEAD defines the initial segment of every PyObject. */
16 #define PyObject_HEAD                   \
17     _PyObject_HEAD_EXTRA                \
18     Py_ssize_t ob_refcnt;               \            //引用计数
19     struct _typeobject *ob_type;
20  
21 #define PyObject_HEAD_INIT(type)        \
22     _PyObject_EXTRA_INIT                \
23     1, type,
24  
25 #define PyVarObject_HEAD_INIT(type, size)       \
26     PyObject_HEAD_INIT(type) size,
27 ....
28  
29 typedef struct _object {
30     PyObject_HEAD
31 } PyObject;
32  
33 typedef struct {
34     PyObject_VAR_HEAD
35 } PyVarObject;

 

 
 
       python 中还有一个比较关键的就是类型对象的定义,像C里面有内置的int , double 一样,python 里也需要内置的对象
接着我们会看到_typeobject 的定义
 1 [object.h]
 2 typedef struct _typeobject{
 3     PyObject_VAR_HEAD            //注意这里也有对象头
 4     char *tp_name;                        //for printing 
 5     int tp_basicsize, tp_itmesize;
 6  
 7  
 8     //methods
 9     destructor tp_dealloc;
10     printfunc   tp_print;
11     .....
12  
13  
14    //more 
15     hashfunc   tp_hash;
16     ternaryfunc  tp_call;
17     ....
18  
19 }  PyTypeObject;

 

     与类型相关联的操作信息一般采取函数指针的形式 ,例如  typedef long (*hashfunc)(PyObject *);这些操作分为  标准操作(dealloc, print , compare),标准操作族(numbers, sequences, mappings) 以及其他操作(hash, buff, call)
 
     另外,值得我们注意的是_typeobject也是个对象,其类型为PyType_Type
 
 1 [typeobject.c]
 2  
 3 PyTypeObject PyType_Type ={
 4     PyObject_HEAD_INIT(&PyType_Type)
 5     0,
 6     "type",
 7     sizeof(PyHeadTypeObject),
 8     sizeof(PyMemberDef),
 9     ....
10     PyObject_GC_Del,
11     (inquiry) type_is_gc,
12  
13 };
14 //以一个整数对象为例:
15 PyTypeObject  PyInt_Type = {
16     PyObject_HEAD_INIT(&PyType_Type)
17     0,
18     "int",
19     sizeof(PyIntObject),
20     ...
21 };

 

 
     紧接着我们会留意到针对PyObject一系列的宏,首先是:
 1 #define _Py_NewReference(op) (                          \
 2     _Py_INC_TPALLOCS(op) _Py_COUNT_ALLOCS_COMMA         \
 3     _Py_INC_REFTOTAL  _Py_REF_DEBUG_COMMA               \
 4     Py_REFCNT(op) = 1)
 5  
 6 #define _Py_ForgetReference(op) _Py_INC_TPFREES(op)
 7  
 8 #define _Py_Dealloc(op) (                               \
 9     _Py_INC_TPFREES(op) _Py_COUNT_ALLOCS_COMMA          \
10     (*Py_TYPE(op)->tp_dealloc)((PyObject *)(op)))
11 #endif /* !Py_TRACE_REFS */
12  
13 #define Py_INCREF(op) (                         \
14     _Py_INC_REFTOTAL  _Py_REF_DEBUG_COMMA       \
15     ((PyObject*)(op))->ob_refcnt++)
16  
17 #define Py_DECREF(op)                                   \
18     do {                                                \
19         if (_Py_DEC_REFTOTAL  _Py_REF_DEBUG_COMMA       \
20         --((PyObject*)(op))->ob_refcnt != 0)            \
21             _Py_CHECK_REFCNT(op)                        \
22         else                                            \
23         _Py_Dealloc((PyObject *)(op));                  \
24     } while (0)
25  

 

 
     第一个是新建对象引用,即初始化ob_refcnt=1,很有意思哈,连comma——','都被宏定义了,然后是丢弃对象引用:
1 #define _Py_INC_TPFREES(OP)     dec_count(Py_TYPE(OP))

    然后是对对象引用的自增、自减操作。当ob_refcnt=0时,调用析构函数,即tp_dealloc。另外如果OP是个NIL,必须使用Py_XINCREF/Py_XDECREF。基本非常基础的内容,比较浅显,是python设计的开始,和MFC的原理有点类似,PyObject对应CObject。

posted @ 2013-01-10 09:34 happydpc 阅读(510) 评论(0) 推荐(0)
摘要: 原文链接sed 手册阅读笔记摘要sed 手册本身不太适合初学者,我在看的过程中加了一些 自己的注释和一些例子,帮助理解,如有偏差或错误,请指出,多谢。目录1. sed的工作原理2. sed中如何选择特定的行3. sed的命令行选项4. sed命令1. sed的工作原理sed维护两个缓冲区,pattern space和 hold space,命令开始执行之前都为空。pattern space缓冲区用于临时保存每次读取的一行的内容,大部分的 匹配和替换等等操作都是针对pattern space中的内容进行的,因此不会对输 入文件有任何影响;而hold space则作为后备缓冲区使用。sed针对输入 阅读全文
posted @ 2012-08-18 10:00 happydpc 阅读(361) 评论(0) 推荐(0)
摘要: 最近在做一些图论的题,像steiner 树一类的算法,还有网络流,下面转载了500道进阶练习题,希望以后能针对性的训练一下,毕竟是熟能生巧,不练不知道。=============================以下是最小生成树+并查集======================================【HDU】1213 How Many Tables 基础并查集★1272 小希的迷宫 基础并查集★1325&&poj1308 Is It A Tree? 基础并查集★1856 More is better 基础并查集★1102 Constructing R... 阅读全文
posted @ 2012-08-14 00:32 happydpc 阅读(1273) 评论(0) 推荐(1)
摘要: 在博客园设置中,找到页首html,并加入如下js代码:<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"> MathJax.Hub.Config({ extensions: ["tex2jax.js","TeX/noErrors.js","TeX/AMSsymbols.js"], jax: ["in 阅读全文
posted @ 2012-08-12 17:23 happydpc 阅读(437) 评论(0) 推荐(0)
摘要: 编译原理课程主要分为两种,一种侧重理论,一种侧重实现(implemention)。而LEX&YACCl是一个可以很方便实践编译原理的有力工具,结合龙书来学习是个不错的选择。如果你已经使用了一段时间的Unix,你会发现很多神奇的YACC/LEX程序,或则你是一个GNU/linux的程序员,则是Flex & Bison, Flex 是Vern Paxon有用lex实现的,而Bison则是GNU版本的YACC,新版本是向上兼容的,所以你可以用Flex/Bison来尝试下面的例子。 LexLex程序产生一个所谓的‘Lexer’。这是一个将字符流作为它的输入的函数,而且每当出现一组字符串 阅读全文
posted @ 2012-08-12 13:56 happydpc 阅读(513) 评论(0) 推荐(0)
摘要: 英文源文件来自http://linux.die.net/man/4/epoll名字epoll-I/O事件消息通知器包含文件#include <sys/epoll.h>描述epoll是一个poll的变种,它可以用来作为边沿或者电平触发接口,可以很好的扩展到大量的监管的fds(文件描述符)。在建立和控制一个epoll集合的过程中会有以下三个call: epoll_create, epoll_ctl, epoll_wait.epoll_create建立一个连接到fd的epoll set. 至于对某个特定的fds,则是通过epoll_ctl, 最后,实际的等待是通过epoll_wait启动 阅读全文
posted @ 2012-08-12 01:17 happydpc 阅读(485) 评论(0) 推荐(0)
摘要: 看了太多杂七杂八的东西,而一直不肯去实践,觉得还是得写写博客,总觉得自己太过于贪心,什么都想学,结果什么都不精通。为了以后不再这样下去,我觉得写写blog还是很有必要的。把自己学到的东西用自己的话表述出来,这是一种能力。而写博客恰恰能帮助自己做到这一点。 最近看了《effective C++》,因为看的是英文版,有很多地方都是跳过去的,因为有些东西,明白了就不需要再花那么多时间去细看了。关于C++面向对象的理解,一个是在代码设计方面,主要是照顾到代码复用,pure virtual function主要是提供一个interface,而commonvirtual function 主要是既提供In 阅读全文
posted @ 2012-03-05 22:15 happydpc 阅读(128) 评论(0) 推荐(0)
摘要: 说说最近的几个事情1.project采用lua,ui模块肯定是要彻底使用utf-16的,可是lua不支持,怎么办?最后好像是写了userdata,可以将multibytes转成utf-16保存在这个userdata中;接着为了保证字符串相同的userdata做key时是相同的,于是又添加了相应的避免重复功能;最后还为这个userdata在gc方面作了保证。2.google:lua unicode,... 阅读全文
posted @ 2010-09-14 14:35 happydpc 阅读(1025) 评论(0) 推荐(0)
点击右上角即可分享
微信分享提示