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)函数参数写好。