摘要:某公司的基础开发平台,有大概N多个函数,boss要求小A,为每个函数添加权限验证功能,而且要求不得修改函数内部结构,让小A尝试从代码外部入手,作为新手小A来讲,这无疑是一个巨大的工作量,难道TM的要一个一个加到里面不可么~~~~生无可恋的小A无奈的望着桌面,在扫过谷歌浏览器图标的那一刻,突然一紧,于是机智的打开谷歌搜索,欲寻到一个简单的方法,经过搜索在一个叫银角大王的lowB博客里面找到了一个叫做装饰器的东东,然后耐心的看了下去……
图解python装饰器的执行流程
1 #装饰器的使用 2 # 自动执行outer函数并且将其下面的函数名f1当作参数传递 3 # 将outer函数的返回值,重新赋值给f1 4 # 1、遇到def outer(func) 加载到内存,跳过函数体 5 # 2、遇到@outer,将f1作为参数传入func中 6 # 3、遇到def inner():将函数加载到内存跳过函数体 7 # 4、遇到return inner,将inner函数作为整体,赋值给f1 8 # 5、遇到f1(),调用inner函数体,执行print(‘log’) 9 # 6、遇到return func() 执行作为参数传入func中的老的f1函数的函数体print('F1') 10 # 7、遇到return 'lululu'将lululu传回f1()中 11 def outer(func): 12 def inner(): 13 print('log') 14 return func() 15 return inner 16 @outer 17 def f1(): 18 print('F1') 19 return 'lululu' 20 print(f1()) 21 >>>log 22 >>>F1 23 >>>lululu
#带参数的传递 def outer(func): def inner(a): print('before') r=func(a) print('after') return r return inner @outer def f1(arg): print(arg) return 'lululu' print(f1('huhuh')) >>>before >>>huhuh >>>after >>>lululu #万能参数传递 def outer(func): def inner(*args,**kwargs): print('before') r=func(*args,**kwargs) print('after') return r return inner @outer def f1(arg): print('f1函数体',arg) return 'lululu' print('返回值',f1('huhuhu')) >>>before >>>f1函数体 huhuhu >>>after >>>返回值 lululu @outer def f2(a1,a2): print('f2函数体','F2') return 'aa' 'bb' print('返回值',f2('hu','lu')) >>>before >>>f2函数体 F2 >>>after >>>返回值 aabb