装饰器


# 一个函数装饰器的列子
def log(func):
def wrapper(*args,**kwargs):
print('Name=%s'%func.__name__)
return func(*args,**kwargs)
return wrapper
@log
def Print():
print('2017-2-3')
return None
Print()
'''
观察上面的log,因为它是一个decorator,所以接受一个函数作为参数,并返回一个函数。
通过@方法调用后,调用log输入Print为参数函数,在wrapper中修改,然后整合成为新的函数返回
'''
D:\untitled1\venv\Scripts\python.exe D:/untitled1/装饰器.py
Name=Print
2017-2-3

常用装饰器模板


  • 无参数的装饰器:【因为返回的那个wrapper()函数名字就是'wrapper',所以,需要把原始函数的__name__等属性复制到wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错。】
import functools

def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
  • 有参数的装饰器:【因为返回的那个wrapper()函数名字就是'wrapper',所以,需要把原始函数的__name__等属性复制到wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错。】
import functools

def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator

装饰器案例


# 一个装饰器计算函数执行时间
import time, functools
def log(func):
@functools.wraps(func) # 保证函数名一致的方法
def wrapper(*args, **kw):
''' 下面三个为装饰器装饰后的功能增加项 '''
oldTime = time.process_time()
result = func(*args, **kw)
newTime = time.process_time()
print('函数 %s 运行时间为 %s ms' % (func.__name__ ,newTime - oldTime))
return result
return wrapper
@log
def test():
for x in range(1, 10000000):
x += 1
test()

友情链接:





最新文章

  1. [bigdata] flume file channel CPU消耗比 memory channel高的原因
  2. 莫名其妙MyEclipse
  3. <Operating System>进程调度
  4. toad的基本操作
  5. Ajax技术
  6. Java:那些把自己陷进去的误区(一)
  7. Linux系统管理命令之权限管理
  8. PCA算法是怎么跟协方差矩阵/特征值/特征向量勾搭起来的?
  9. 学习hibernate @Entity该导入哪个包
  10. TCP中close和shutdown之间的区别
  11. CentOS下安装gns3
  12. php curl request
  13. 2014ACMICPC亚洲区域赛牡丹江现场赛之旅
  14. Android学习笔记:ActionBar使用介绍
  15. [android]APP启动界面——SplashActivity
  16. 并发编程-JUC之Atomic
  17. 关于Java项目打包成Runnable jar文件后运行时图片不显示的问题
  18. redis 的简单使用
  19. HelloStruts
  20. 爬虫Scrapy框架

热门文章

  1. 消息中间件JMS(二)
  2. 发布Android程序
  3. 指令过滤器orderBy
  4. c语言描述的直接插入排序法
  5. JavaScript创建对象的三种方法
  6. 石头剪刀布的JAVA小程序 供初学者参考
  7. React中setState同步更新策略
  8. c++stl应用入门
  9. 寻找AP数
  10. jQuery-qrcode.js 生成带Logo 的二维码