python装饰器执行顺序
. python 装饰器
1) 2层装饰器

def decorator(func):
# TODO
def wrapper(*args, **kwargs):
# TODO
func(*args, **kwargs)
# TODO
# TODO
return wrapper

2) 3层装饰器

def decorator3(a=0, b=0):
# TODO
def wrapper(func):
# TODO
def inner_wrapper(*args, **kwargs):
# TODO
func(*args, **kwargs)
# TODO
# TODO
return inner_wrapper
# TODO
return wrapper

此处a,b可为任意指定参数,但不可以更改。
3) 类装饰器, python中类本身是不可调用的, 需要实现__call__方法, 将类变为callable。

class decorator(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
# TODO
self.func(*args, **kwargs)
# TODO


class decorator2(object):
def __call__(self, func):
# TODO
def wrapper(*args, **kwargs):
# todo
func(*args, **kwargs)
# todo
# TODO
return wrapper

python装饰器使用闭包的方式提供aop的概念。不过需要注意,装饰器装饰的函数,无法通过func.__name__获得真正的函数名, 可以导入functools.wraps包装。

wraps实际上调用的update_wrapper。

2. python装饰器的执行顺序。

1 import time
2
3
4 def log(level="info"):
5 print "log"
6
7 def wrapper(f):
8 print "wrapper start"
9
10 def inner_wrapper(*args, **kwargs):
11 print "inner_wrapper start"
12 print "{0}: {1}".format(level, time.time())
13 f(*args, **kwargs)
14 print "{0}: {1}".format(level, time.time())
15 print "inner_wrapper end"
16
17 print "wrapper end"
18 return inner_wrapper
19
20 print "end"
21 return wrapper
22
23
24 def log2(f):
25 print "log2..."
26
27 def wrapper(*args, **kwargs):
28 print "log2"
29 f(*args, **kwargs)
30 print "log2"
31
32 print "log2..."
33 return wrapper
34
35
36 @log2
37 @log(level="debug")
38 def test(a, b):
39 print a, b

执行test,输出

参见:https://segmentfault.com/a/1190000007837364
多个装饰器是按从下到上的顺序执行的, 在上图的例子中,test可以简化为test=log2(log(test)), 先执行log装饰器inner_wrapper外层的,得到inner_wrapper, 此时inner_wrapper是log2, 得到log2的wrapper, 此wrapper封装的func是log的inner_wrapper, 依次顺序执行,
结果如上图所示。
python装饰器执行顺序的更多相关文章
- Python 装饰器执行顺序
Python 装饰器执行顺序 之前同事问到两个装饰器在代码中使用顺序不同会不会有什么问题,装饰器是对被装饰的函数做了一层包装,然后执行的时候执行了被包装后的函数,例如: def decorator_a ...
- Python装饰器执行顺序详解
探究多个装饰器执行顺序 装饰器是Python用于封装函数或代码的工具,网上可以搜到很多文章可以学习,我在这里要讨论的是多个装饰器执行顺序的一个迷思. 疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会 ...
- Python 装饰器执行顺序迷思
Table of Contents 1. 探究多个装饰器执行顺序 1.1. 疑问 1.2. 函数和函数调用的区别 1.3. 装饰器函数在被装饰函数定义好后立即执行 1.4. 疑问的解释 2. 参考资料 ...
- Python面试题之多个装饰器执行顺序
疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会说明它们是自上而下的,比如下面这个例子: def decorator_a(func): print 'Get in decorator_a' def ...
- 粗浅聊聊Python装饰器
浅析装饰器 通常情况下,给一个对象添加新功能有三种方式: 直接给对象所属的类添加方法: 使用组合:(在新类中创建原有类的对象,重复利用已有类的功能) 使用继承:(可以使用现有类的,无需重复编写原有类进 ...
- Python基础篇【第6篇】: Python装饰器
装饰器 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类, ...
- 理解Python装饰器
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权 ...
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
- python装饰器方法
前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...
随机推荐
- AngularJS的form状态变色
代码下载:https://files.cnblogs.com/files/xiandedanteng/angularjsChangeFormClass.rar 代码: <!DOCTYPE HTM ...
- linux中ERROR: The partition with /var/lib/mysql is too full!解决的方法
今天在ubuntu上遇见这个问题.应该是我的第一分区太小了. 解决的方法: bey0nd@wzw:/var$ cd /var bey0nd@wzw:/var$ rm -rf log 我们删除日志文件 ...
- C 标准库 - <stdarg.h>
C 标准库 - <stdarg.h> 简介 stdarg.h 头文件定义了一个变量类型 va_list 和三个宏,这三个宏可用于在参数个数未知(即参数个数可变)时获取函数中的参数. 可变参 ...
- CSDN - 进程结束后new出的内存会回收吗?
http://blog.csdn.net/stanjiang2010/article/details/5386647 关键词:内存回收
- start-dfs.sh 和 start-all.sh的区别
start-dfs.sh 只启动namenode 和datanode, start-all.sh还包括yarn的resourcemanager 和nodemanager 之前就所以因为只启动了star ...
- 【转载】How to develop your own Boot Loader【怎么样开发自己的bootloader】
How to develop your own Boot Loader 怎么样开发自己的bootloader Table of content[目录] 1. Who may be interested ...
- sed系列:行或者模式匹配删除特定行
“p” command prints the buffer (remember to use -n option with “p”) “d” command is just opposite, its ...
- 基于flask做权限控制
和Django实现的原理类似,有时间补充
- 数据库中表的复杂查询&分页
一.数据库中表的复杂查询 1)连接查询 1.0连接的基本的语法格式: from TABLE1 join_type TABLE2 [on (join_condition)][where (query_c ...
- iOS 7 中 StoryBoard 总体缩放
iOS 7 中 StoryBoard 总体缩放 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用 ...