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__

 

嗯。先写这么多吧。

转载于:https://www.cnblogs.com/svinlearnpy/p/3619837.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值