Monthly Archives: 十二月 2013

You are browsing the site archives by month.

当初看 Dive into Python 的时候就听过装饰器,不过知道是个语法糖,感觉上没什么用,就没仔细了解,这几天看一段代码用到了装饰器,只好再研究下吧。

为什么使用装饰器?

AstralWind 在他的博客里这么说,“装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。”

打个比方,我是个有怪癖的人,在调用任何函数的时候总希望先输出函数的name和doc,因为我常常反复传递函数,所以最好把这个函数的引用计数也显示下?要么把函数运行时间也显示出来吧!

如果不用装饰器,我们可能在写函数的时候把name、doc什么的都print出来,这样有些麻烦,写多少个函数就得copy多少次,利用Python万物皆对象的特性,我们不妨写个函数来做这件事情:

不过这样在调用函数的时候总得先把函数传给PrintDetail(),既不美观也不方便,那么是时候让装饰器登场了:

这里我们定义了装饰器,不过,等等,我运行完发现怎么我还没调用func,他就运行了?
上面这个装饰器是不合格的,如果你尝试去掉用的话,甚至会发现装饰器只会调用一次。
这是因为我们还没弄清楚究竟什么时装饰器,我先提供一个正确的装饰器:

为什么要提供_PrintDetail,而且还要把它返回?
为什么现在看起来就不会没调用自动运行?
为什么现在多次运行都可以自动调用装饰器了?

虽然没有读过Python关于这部分的源码,但是大概可以推测出Python涉及到装饰器时怎么工作的:
Read More →

不知道有没有人喜欢用ctypes,反正我是不大喜欢的。用了ctypes之后程序会显得很凌乱——为了调用c/c++写的dll,动不动c_int或者c_char_p,要是碰上dll里各种用结构体或者数组或者指针的话,那更是悲剧了。想象下先写个c_char_p,然后再pointer(),然后组合起来一个struct,再排出个数组,最后还要获得其指针?

简直就是个悲剧,好了,吐槽完毕,下面说正经的,有一个数据采集仪,提供一个dll方便我们取数据,VC6.0下编译的,某个函数在文档中给出原型如下:

  1. // 功能描述:获取传感器的测量值。   
  2. // 输入参数:pSensorVal,用户分配的用来保存传感器值的数组首地址;   
  3. //           pSensorCount,用户分配的数组长度;   
  4. // 输出参数:pSensorVal,保存采集到的传感器的值;   
  5. //           pSensorCount,分析仪中的传感器数,如果分析仪中的传感器数大于用户指定的个数,则只返回用户指定个数的传感器值。   
  6. // 返 回 值:成功返回1;失败返回负数;   
  7. //           -1:获取失败   
  8. FBGA_DR_API int FBGA_GetSensorVal (SSensorVal *pSensorVal, int *pSensorCount);  

Read More →