摘要:某公司的基础开发平台,有大概N多个函数,boss要求小A,为每个函数添加权限验证功能,而且要求不得修改函数内部结构,让小A尝试从代码外部入手,作为新手小A来讲,这无疑是一个巨大的工作量,难道TM的要一个一个加到里面不可么~~~~生无可恋的小A无奈的望着桌面,在扫过谷歌浏览器图标的那一刻,突然一紧,于是机智的打开谷歌搜索,欲寻到一个简单的方法,经过搜索在一个叫银角大王的lowB博客里面找到了一个叫做装饰器的东东,然后耐心的看了下去……

图解python装饰器的执行流程

 #装饰器的使用
# 自动执行outer函数并且将其下面的函数名f1当作参数传递
# 将outer函数的返回值,重新赋值给f1
# 1、遇到def outer(func) 加载到内存,跳过函数体
# 2、遇到@outer,将f1作为参数传入func中
# 3、遇到def inner():将函数加载到内存跳过函数体
# 4、遇到return inner,将inner函数作为整体,赋值给f1
# 5、遇到f1(),调用inner函数体,执行print(‘log’)
# 6、遇到return func() 执行作为参数传入func中的老的f1函数的函数体print('F1')
# 7、遇到return 'lululu'将lululu传回f1()中
def outer(func):
def inner():
print('log')
return func()
return inner
@outer
def f1():
print('F1')
return 'lululu'
print(f1())
>>>log
>>>F1
>>>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

最新文章

  1. web测试方法总结
  2. 工作当中实际运用(3)——js原生实现鼠标点击弹出div层 在点击隐藏
  3. [译]C++, Java和C#的编译过程解析
  4. 【BZOJ】1090: [SCOI2003]字符串折叠(dp)
  5. css 前景色与背景色
  6. php unserialize 返回false的解决方法
  7. HTTP代理协议 HTTP/1.1的CONNECT方法
  8. ibatis 到 MyBatis区别
  9. Android JNI使用方法
  10. poj 2094 多项式求和。
  11. 用 monitorix 开启linux图形化监控
  12. 郑厂长系列故事——排兵布阵 hdu4539(状态压缩DP)
  13. 利用python基于微博数据打造一颗“心”
  14. JavaScript中函数function fun(){}和 var fun=function(){}的区别
  15. 从内部入手,浅谈malloc和new的区别
  16. LeetCode题解之Squares of a Sorted Array
  17. indexedDB为何物
  18. 第四篇 HTTP请求返回状态码收集及解释
  19. Cookies Client Identification
  20. Class.forName和ClassLoader的区别

热门文章

  1. ansible 2.1.0 api 编程
  2. Java Annotation使用详解
  3. LeetCode Add Digits (规律题)
  4. 判断一个字符串是否为GUID的方法
  5. python剑指offer 包含min函数的栈
  6. python_69_内置函数1
  7. C#继承机制 访问与隐藏基类成员
  8. MyISAM 和 InnoDB 的区别与优化
  9. 避免修改Android.mk添加cpp文件路径
  10. 井字游戏 人机对战 java实现