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__
嗯。先写这么多吧。