Python装饰器与面向切面编程
2012-11-19 10:21
337 查看
1. 装饰器入门
1.1. 需求是怎么来的?
装饰器的定义很是抽象,我们来看一个小例子。?
1.2. 以不变应万变,是变也
还记得吗,函数在Python中是一等公民,那么我们可以考虑重新定义一个函数timeit,将foo的引用传递给他,然后在timeit中调用foo并进行计时,这样,我们就达到了不改动foo定义的目的,而且,不论B君看了多少个函数,我们都不用去修改函数定义了!?
1.3. 最大限度地少改动!
既然如此,我们就来想想办法不修改调用的代码;如果不修改调用代码,也就意味着调用foo()需要产生调用timeit(foo)的效果。我们可以想到将timeit赋值给foo,但是timeit似乎带有一个参数……想办法把参数统一吧!如果timeit(foo)不是直接产生调用效果,而是返回一个与foo参数列表一致的函数的话……就很好办了,将timeit(foo)的返回值赋值给foo,然后,调用foo()的代码完全不用修改!?
2. Python的额外支持
2.1. 语法糖
上面这段代码看起来似乎已经不能再精简了,Python于是提供了一个语法糖来降低字符输入量。?
2.2. 内置的装饰器
内置的装饰器有三个,分别是staticmethod、classmethod和property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。由于模块里可以定义函数,所以静态方法和类方法的用处并不是太多,除非你想要完全的面向对象编程。而属性也不是不可或缺的,Java没有属性也一样活得很滋润。从我个人的Python经验来看,我没有使用过property,使用staticmethod和classmethod的频率也非常低。?
2.3. functools模块
functools模块提供了两个装饰器。这个模块是Python 2.5后新增的,一般来说大家用的应该都高于这个版本。但我平时的工作环境是2.4 T-T2.3.1. wraps(wrapped[, assigned][, updated]):这是一个很有用的装饰器。看过前一篇反射的朋友应该知道,函数是有几个特殊属性比如函数名,在被装饰后,上例中的函数名foo会变成包装函数的名字wrapper,如果你希望使用反射,可能会导致意外的结果。这个装饰器可以解决这个问题,它能将装饰过的函数的特殊属性保留。?相关文章推荐
- Python装饰器与面向切面编程
- 转:Python装饰器与面向切面编程
- python 多个装饰器组合应用,实现面向切面之AOP编程
- Python装饰器与面向切面编程
- Python装饰器与面向切面编程
- 转:Python装饰器与面向切面编程
- Python装饰器与面向切面编程
- Python装饰器与面向切面编程
- Python装饰器与面向切面编程
- Python装饰器与面向切面编程
- Python面向切面编程-语法层面和functools模块
- Python的装饰器模式与面向切面编程详解
- python有面向过程、面向对象、函数式编程,面向切面编程、泛型编程多种编程范式
- Python面向切面编程-语法层面和functools模块
- python 装饰器@ 面向切面的编程
- AOP面向切面编程简介
- AOP 面向切面编程
- spring面向切面编程入门实例
- 发布 python-message,一个面向消息编程的程序库
- Python——装饰器与面向切面编程