一种从没见过的python装饰器求指导,python装饰,求详解,第一种多的一层包
一种从没见过的python装饰器求指导,python装饰,求详解,第一种多的一层包
求详解,第一种多的一层包裹到底是用来干嘛的
这种装饰器很常见,也没问过为什么
>>> def log(func):... def wrapper(*args, **kwargs):... print "call: ", func.__name__... return func(*args, **kwargs)... return wrapper... >>> @log... def now():... print "It's now..."... >>> now()call: nowIt's now...
这种... 我第一次见,求详解
>>> def log(func):... print "call: ", func.__name__... return func... >>> @log... def now():... print "It's now......"... call: now>>> now()It's now......
我觉得装饰器可以看做是闭包的一种特殊形式
@decoratordef func(): pass# 等价于func = decorator(func)
至少要有闭包才能算真正的装饰器
>>> def log(func):... print 'call:', func.__name__... return func... >>> @log... def now():... print 'It is now ...'... call: now>>> now()It is now ...>>> print now.func_closureNone
只要你能够理解下列代码:
@log def now(): print('now')
与
def now(): print('now')now = log(now)
完全一样,一切问题就可以用很容易的方式来解释了。
为什么会有个 wrapper 函数来将代码包一层?
这是为了接收 now 函数的参数。
既然 now = log(now) 那就要求 log 的返回值必须是个函数。当你调用 now(*args) 的时候就必须要保证 log 返回的函数能够接收到 *args 参数。这下你明白了吧。
装饰器函数的第一层用于接收被装饰函数的函数本身,第二层用于接收调用被装饰函数时,传递的参数。关于这个,我写过一篇blog
http://coolbit.in/blog/2014/03/29/decorator-exception-handling/
编橙之家文章,
相关内容
- 求常量处理基于Flask的Templates方法,flasktemplates,例如:
- python js对象的遍历,pythonjs对象,下面是两组数据格式;
- Python爬虫框架哪个最好用最简单,python爬虫框架,想使用
- Python除scrapy外,还有哪些优秀开源爬虫抓取框架工具呢
- Python编程语言和python脚本到底有什么区别?,python编程
- Python编译器怎么样处理tab和空格缩进问题,pythontab,设计
- Python项目引入第三方库好还是自己造轮子好?,python轮子
- Flask开源cms有哪些值得学习参考,flask开源cms值得,考虑
- Django显示文章摘要需要如何写,Django显示文章摘要,需要
- Python解密问题,js RSA加密后再PY里解密行得通吗?,rsapy
评论关闭