一、wraps

作用:优化装饰器

from functools import wraps     # 导入wraps

def wrapper(f):
@wraps(f) # wraps的语法糖
def inner(*args, **kwargs):
ret = f(*args, **kwargs)
return ret
return inner @wrapper
def f1():
print("Hello, World!")
return 'Hi' res = f1()
print(res)
print(f1.__name__) # 查看字符串格式的函数名,打印的函数名inner->f1

二、带参数的装饰器

实质:嵌套调用,三层嵌套函数

from functools import wraps
import time
flag = True def wrapper_out(is_flage):
def wrapper(func):
"""
flag为True时函数被装饰器装饰
flag为FLASE时函数正常被调用
:param func:
:return:
"""
@wraps(func)
def inner(*args, **kwargs): # 聚合
if is_flage:
start = time.time()
ret = func(*args, **kwargs) # 打散
end = time.time()
print(end-start)
return ret
else:
ret = func(*args, **kwargs)
return ret
return inner
return wrapper @wrapper_out(flag) # @wrapper_out()->@wrapper->f1=wrapper(f1) 调用wrapper_out(flag)函数,return wrapper
def f1():
time.sleep(1)
print("Hello, World")
return 'joker' ret = f1()
print(ret)

三、多个装饰器装饰一个函数

from functools import wraps

def wrapper1(func):     # func->f1
@wraps(func)
def inner1(*args, **kwargs):
print("wrapper1,before") #
ret = func(*args, **kwargs) # 3, f1()
print("wrapper1,after") #
return ret # ret is f1()的返回值,现在是执行inner1()的返回值
return inner1 def wrapper2(func): # func->inner1
@wraps(func)
def inner2(*args, **kwargs):
print("wrapper2,before") #
ret = func(*args, **kwargs) # inner1()
print("wrapper2,after") # 5, 执行完inner1()
return ret # ret is inner1()的返回值即f1()的返回值,现在是执行inner2()的返回值
return inner2 @wrapper2 # f1=wrapper2(inner1)
@wrapper1 # f1=wrapper1(f1)->f1=inner1
def f1(a):
print("Hello")
return a """
f1指向inner2的内存地址,f1()->inner2(),f1()的返回值是inner2()的返回值,也就是f1()函数自身的返回值
"""
ret = f1(2)
print(ret)
"""
结果:
wrapper2,before
wrapper1,before
Hello
wrapper1,after
wrapper2,after
2
"""

现象:

 

最新文章

  1. 如何获取用户的真实IP
  2. 介绍两个挺好用的基于Jquery的上传工具
  3. [MongoDB]安装MongoDB
  4. MongoDB释放磁盘空间
  5. iOS蓝牙开发(一)蓝牙相关基础知识(转)
  6. 优化Webstorm
  7. 移动设备中导入gdb调试工具
  8. 【模板】Big-Step-Giant-Step 大步小步
  9. Linux之read用法
  10. Retrofit的使用
  11. HDU2647(拓扑排序+反向建图)
  12. VHDL设计问题
  13. Java 8并发工具包漫游指南
  14. python基础-函数(9)
  15. (七)jdk8学习心得之join方法
  16. VSCode 必装的 10 个高效开发插件
  17. new image()
  18. python1113
  19. 探索一个NSObject对象占用多少内存?
  20. windows powershell

热门文章

  1. 【30.43%】【codeforces 746C】Tram
  2. 2019-8-31-win10-uwp-使用-WinDbg-调试
  3. JS异步解决方案
  4. HDU4742 CDQ分治,三维LIS
  5. linux包之dracut
  6. win10 配置g++环境
  7. mac笔记本安装Android sdk
  8. 关于redis有序集合http://www.runoob.com/redis/redis-sorted-sets.html
  9. 北京联通盒子-数码视讯Q7-破解
  10. node.js UDP NAT 穿透实现