首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

python兑现decorator模式

2012-09-10 
python实现decorator模式python有个很常用的语法糖是@decorator,使用它可以很方便的创建decorator装饰器模

python实现decorator模式
python有个很常用的语法糖是@decorator,使用它可以很方便的创建decorator装饰器模式。(当然,@的用处可不只用在创建装饰器模式)方法有两种,一种是通过创建一个包裹类Wrapper,另一种就是直接通过一个函数创建closure

简要说下装饰器模式:不改变目标的内部行为,改变目标的外在表现方式的一种模式。重点在于,它一定不干涉“内政”,只可以在目标的外围进行修饰,对目标是透明的。

函数的方法最简单


输出结果是:
foo = Wrapper(3)(foo)(*args)
返回了一个闭包。通过最后一行的打印结果证实了我的想法。这个类也形成了一个闭包。

值得注意的有两点:一是Wrapper类使用了__call__函数,这个函数仅在发生调用时instance(*args),才会被激活,相当与instance.__call__(*args)
二是不要瞎折腾。 我在这里尝试把Wrapper的参数,传递给foo,这里需要w函数和foo的参数列表保持一致就可以不报错。但是这样做起不到改变foo函数行为的作用,顶多改变这个foo函数的默认参数,所以是毫无意义的!如果没有特殊必要,请不要把Wrapper的参数往foo中塞,Wrapper的函数仅在foo调用前后调用才有意义。

最后一点写参数表的心得体会是,在写装饰器的时候,如果拿不准func参数怎么写,怎么把它包装起来,那么就先写func(*args),然后再完善上面一层封包,直至最后把w(func)函数参数写好。

热点排行