1.定义:
在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
装饰器本质上就是闭包的使用,闭包就是函数的引用,闭包就是把要装饰的函数引用过来但是不运行,完成必要的功能在运行要装饰的函数,这样就完成了函数的动态功能扩展。
Python装饰器是Python中的特有变动,可以使修改函数变得更容易。
2:实现
#coding:utf-8
import time
def log(func):
def dec():
time_start=time.time()
func()
time_end=time.time()
print("用时:"+str(time_end-time_start))
return func #返回函数本身,装饰器并不修改原函数
return dec
@log
def sum_100():
print(sum(range(101)))
sum_100()
输出为:
5050
用时:0.0
相当于是
def sum_100():
print(sum(range(101)))
sum_100=log(sum_100)
sum_100()
如果函数有参数,则上述程序将报错:
改进:
#coding:utf-8
import time
def log(func):
def dec(*args,**kw):
time_start=time.time()
func(*args,**kw)
time_end=time.time()
print("用时:"+str(time_end-time_start))
return func
return dec
@log
def sum_100(n):
print(sum(range(n+1)))
sum_100(100)
输出为:
5050
用时:0.0
如果decorator本身需要传入参数,那就需要编写一个返回decorator的高阶函数,写出来会更复杂。比如,要自定义log的文本:
#coding:utf-8
import time
def log(text):
def decorator(func):
def dec(*args,**kwargs):
print(text)
time_start=time.time()
func(*args,**kwargs)
time_end=time.time()
print("用时:"+str(time_end-time_start))
return func
return dec
return decorator
@log("welocme")
def sum_100(n):
print(sum(range(n+1)))
sum_100(100)
结构上:
def log(text):
def decorator(func):
def dec(*args,**kwargs):
return func
return dec
return decorator
对称结构,其中最内层return 被装饰的函数。
输出:
welocme
5050
用时:0.0