python装饰器详解
# -*- coding:utf-8 -*- import time #作者: baikai #创建时间: 2018/12/4 13:22 #文件: demo.py #IDE: PyCharm #装饰器 #1:不能修改被装饰的函数的源代码 #2:不能够改变被装饰函数的调用方式 #应用场景:插入日志、性能测试、处理事务 #需求测试一个函数大概运行多少时间 def f(): print('I am f') time.sleep(2) def new_f(): start_time=time.time() f() end_time=time.time() print('耗时:%s'%(end_time-start_time)) if __name__ == '__main__': new_f()
#理解装饰器之前,还需要理解3句话 #1.函数即变量 #函数也可以作为参数,函数也可以作为返回值 #2.高阶函数 #以函数作为参数,或者返回值是函数的函数 #3.函数嵌套 #函数里面定义函数 #高阶函数+嵌套函数=装饰器 def my_time(func): def wrapper(): start_time=time.time() func() end_time=time.time() print('%s耗时%s秒' % (func.__name__,(end_time-start_time))) #不加()是返回该函数,加()是返回该函数的结果 return wrapper def f(): print('I am f') time.sleep(2) n=my_time(f) #n等于wrapper f=n f()
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
# -*- coding:utf-8 -*- import time #作者: baikai #创建时间: 2018/12/4 13:22 #文件: demo.py #IDE: PyCharm #装饰器 #1:不能修改被装饰的函数的源代码 #2:不能够改变被装饰函数的调用方式 #应用场景:插入日志、性能测试、处理事务 #需求测试一个函数大概运行多少时间 #定义一个装饰器 def my_time(func): def wrapper(): start_time=time.time() # func就是f()这个函数,而f()相当于wrapper()这个函数 #所以func()最终就是等于执行wrapper()这个函数 func() end_time=time.time() print('%s耗时%s秒' % (func.__name__,(end_time-start_time))) #不加()是返回该函数,加()是返回该函数的结果 return wrapper @my_time #等于f=my_time(f),执行my_time(f),返回了wrapper这个函数 def f(): print('I am f') time.sleep(2) f() #执行f()就相当于执行wrapper()这个函数
执行结果如下:
I am f
f耗时2.0秒
Process finished with exit code 0
有参装饰器
# -*- coding:utf-8 -*- import time #作者: baikai #创建时间: 2018/12/4 13:22 #文件: demo.py #IDE: PyCharm #装饰器 #1:不能修改被装饰的函数的源代码 #2:不能够改变被装饰函数的调用方式 #应用场景:插入日志、性能测试、处理事务 #需求测试一个函数大概运行多少时间 #定义一个有参装饰器 def my_time(func): def wrapper(*args,**kwargs): start_time=time.time() # func就是f()这个函数,而f()相当于wrapper()这个函数 #所以func()最终就是等于执行wrapper()这个函数 func(*args,**kwargs) end_time=time.time() print('%s耗时%s秒' % (func.__name__,(end_time-start_time))) #不加()是返回该函数,加()是返回该函数的结果 return wrapper @my_time #等于f=my_time(f),执行my_time(f),返回了wrapper这个函数 def f(): print('I am f') time.sleep(2) #有参函数 @my_time def f1(name): print(name) f() #执行f()就相当于执行wrapper()这个函数 f1('baikai')
这样有参函数和无参函数都可以被装饰了
运行结果如下:
I am f
f耗时2.0秒
baikai
f1耗时0.0秒
Process finished with exit code 0

更多精彩