装饰器本身是用来是为一个函数是实现新的功能,并且不改变原函数的代码以及调用方式。

遇到这样一种问题:

众多函数调用了你写的装饰器,但客户有需求说,我想实现我可以随之控制装饰器是否生效。

那你就不可能在得到命令的时候去原函数头部去做删除和添加装饰器调用的命令。这是就可以用到带参数的装饰器,定义一个开关,调用装饰器的时候,把这个装饰器的开关参数给传递进去,这样当开关打开的时候装饰器生效,关闭的时候则只执行原函数的代码。

举例:开关参数为True的时候执行过程:

 F = True          #step 1 装饰器的开关变量
def outer(flag): #step 2
def wrapper(func): #step 4
def inner(*args,**kwargs): #stpe 6
if flag: #step 9
print('before') #step 10
ret = func(*args,**kwargs) #step 11 执行原函数
print('after') #step13
else:
ret = func(*args,**kwargs)
print('')
return ret #step 14
return inner #step 7
return wrapper #step 5 @outer(F) #先执行step 3 :outer(True)这个函数,然后step 6:@wrapper #此处把开关参数传递给装饰器函数
def hahaha():
pass #step 12
hahaha() # step 8 相当于inner()

开关参数为False的时候执行过程:

   F = False          #stpe1 装饰器的开关变量
def outer(flag): #step 2
def wrapper(func): #step 4
def inner(*args,**kwargs): #stpe 6
if flag: #step 9
print('before')
ret = func(*args,**kwargs)
print('after')
else:
ret = func(*args,**kwargs) #step 10 执行原函数
print('') #step 12
return ret #step 13
return inner #step 7
return wrapper #step 5

最新文章

  1. 计算机系列:CUDA 深入研究
  2. 【Java每日一题】20161208
  3. 自学H5第二天
  4. .htaccess是什么?.htaccess几个简单应用
  5. Rocky4.2下安装金仓v7数据库(KingbaseES)
  6. ArrayList,Vector线程安全性测试
  7. 使用GSoap开发WebService客户端与服务端
  8. MySQL通用批量写入工具(Python)
  9. 限制div高度当内容多了溢出时显示滚动条
  10. 第22题 Rotate List
  11. js当地天气调用
  12. java Quartz任务调度器
  13. 【架构师之路】Nginx负载均衡与反向代理—《亿级流量网站架构核心技术》
  14. MySQL之安装以及辅助工具的安装
  15. Pthreads 《并行程序设计导论》的补充代码
  16. 四)Spring + Quartz
  17. 深入理解java虚拟机-第二章:java内存区域与内存泄露异常
  18. SurfaceView实时绘图,视频流
  19. Fiddler--的一些使用技巧
  20. OpenGL(八)使用 subroutine 切换可编程管线

热门文章

  1. Java 13新特性
  2. Qt编写自定义控件54-时钟仪表盘
  3. [Feature] Feature selection - Embedded topic
  4. ubuntu 17.04 Tomcat安装
  5. 【VS开发】【数据库开发】windows下libevent x64库静态编译
  6. Object Detection in 20 Years: A Survey【持续更新中】
  7. Memcached内存调优及建议
  8. [转帖]postgres csv日志和查看用户权限
  9. JVM -- 对象的概述和引用
  10. glib系列2 APP编译