python装饰器的执行顺序_python装饰器执行顺序

1. python 装饰器

1) 2层装饰器

defdecorator(func):#TODO

def wrapper(*args, **kwargs):#TODO

func(*args, **kwargs)#TODO

#TODO

return wrapper

2) 3层装饰器

def decorator3(a=0, b=0):#TODO

defwrapper(func):#TODO

def inner_wrapper(*args, **kwargs):#TODO

func(*args, **kwargs)#TODO

#TODO

returninner_wrapper#TODO

return wrapper

此处a,b可为任意指定参数,但不可以更改。

3) 类装饰器, python中类本身是不可调用的, 需要实现__call__方法, 将类变为callable。

classdecorator(object):def __init__(self, func):

self.func=funcdef __call__(self, *args, **kwargs):#TODO

self.func(*args, **kwargs)#TODO

classdecorator2(object):def __call__(self, func):#TODO

def wrapper(*args, **kwargs):#todo

func(*args, **kwargs)#todo

#TODO

return wrapper

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

1007464-20180528102707821-1114235761.jpg

wraps实际上调用的update_wrapper。

1007464-20180528102820337-1784946894.jpg

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

1 importtime2

3

4 def log(level="info"):5 print "log"

6

7 defwrapper(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 returninner_wrapper19

20 print "end"

21 returnwrapper22

23

24 deflog2(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 returnwrapper34

35

36 @log237 @log(level="debug")38 deftest(a, b):39 print a, b

执行test,输出

1007464-20180528103333660-1860158967.jpg

参见: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, 依次顺序执行,

结果如上图所示。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值