python中的decorator

Decorator 本身是一种语法糖。

语法糖:本身不会带来新特性,但却能使代码更易读,更易写。

1 @decorator
2 def fuc():
3     pass

解释器会解释成

1 func = decorator(func)

此时,这个函数已经不再是原来的func了。

对于定义一个方法的decorator,看起来他更像定义了一个函数里的函数

1 def decorator(fn):
2     def wraper():
3         print 'function name is %s'.fn.name
4     return wraper
5 
6 @decorator
7 def message_A():
8     print 'Hello World'

warrper()参数我们暂时空白,这个可以用来填补函数参数。

那如果我们在decorator中加入参数呢?

那就需要我们再嵌套一个函数到decorator中,real_decorator中再嵌套warrper用作参数,要记得

return real_decorator 这样才算是返回了这个带参数的real_decorator。

 

class式的Decorator

 1 class myDecorator(object):
 2  
 3     def __init__(self, fn):
 4         print "inside myDecorator.__init__()"
 5         self.fn = fn
 6  
 7     def __call__(self):
 8         self.fn()
 9         print "inside myDecorator.__call__()"

在类内 __init__() 中传入function,类在初始化的时候就完成了传递。

 1 class makeHtmlTagClass(object):
 2  
 3     def __init__(self, tag, css_class=""):
 4         self._tag = tag
 5         self._css_class = " class='{0}'".format(css_class) \
 6                                        if css_class !="" else ""
 7  
 8     def __call__(self, fn):
 9         def wrapped(*args, **kwargs):
10             return "<" + self._tag + self._css_class+">"  \
11                        + fn(*args, **kwargs) + "</" + self._tag + ">"
12         return wrapped
13  
14 @makeHtmlTagClass(tag="b", css_class="bold_css")
15 @makeHtmlTagClass(tag="i", css_class="italic_css")

这种本身携带参数的类,我们不能够在__init__()中传入function,需要在函数调用的时候传入。

*args 传递的是列表,*kwargs 传递的是字典。

*这个符号既可以当做 gather 收集,也能理解为 scatter 分散。函数能够接受不定参数。

 python自带的functools库中 wraps()函数,能够让运行过decorator的函数保持原来属性,eg:fun.__name__

 

嗯。先写这么多吧。

posted @ 2014-03-23 22:59  Svin_py  阅读(207)  评论(0编辑  收藏  举报