装饰器
含义:用一个函数装饰另外一个函数或类并为其提供额外功能的语法现象。装饰器本身是一个函数,它的参数是被装饰的函数或类,它的返回值是一个带有装饰功能的函数。
作用:可以减少重复代码
例子
start = time.time()
download('MySQL从删库到跑路.avi')
end = time.time()
print(f'花费时间: {end - start:.3f}秒')
start = time.time()
upload('Python从入门到住院.pdf')
end = time.time()
print(f'花费时间: {end - start:.3f}秒')
上面记录时间、计算和显示执行时间的代码都是重复代码,不妨可以把记录函数执行时间的功能封装到一个装饰器中,在有需要的地方直接使用这个装饰器就可以了。
#定义一个装饰函数,接收要装饰的函数,返回装饰完成的函数
import time
def record_time(func):
# 注意定义即将要返回的函数,注意其传入参数应包含初始函数的参数
def wrapper(*arg,**kwargs):
start = time.time()
result = func(*arg,**kwargs)
end = time.time()
print(f'{func.__name__}执行时间: {end - start:.3f}秒')
返回被装饰函数的返回值,装饰器通常不会改变被装饰函数的执行结果
return result
# 返回经过装饰的函数
return wrapper
装饰函数的使用
1.推荐使用语法糖(可以用@装饰器函数,
将装饰器函数直接放在被装饰的函数上)
import random
import time
def record_time(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f'{func.__name__}执行时间: {end - start:.3f}秒')
return result
return wrapper
@record_time
def download(filename):
print(f'开始下载{filename}.')
time.sleep(random.randint(2, 6))
print(f'{filename}下载完成.')
@record_time
def upload(filename):
print(f'开始上传{filename}.')
time.sleep(random.randint(4, 8))
print(f'{filename}上传完成.')
download('MySQL从删库到跑路.avi')
upload('Python从入门到住院.pdf')
2.当然也可以直接进行函数调用,但不推荐
download = record_time(download)
upload = record_time(upload)
download('MySQL从删库到跑路.avi')
upload('Python从入门到住院.pdf')