装饰器
1、什么是装饰器
器指的是工具/功能
装饰指的是为被装饰对象添加额外的功能
装饰器就是一个函数,用来为其他函数添加额外的功能
2、为何要用装饰器
程序的开发需要遵循一个原则:开放封闭原则
开放:指的是对拓展功能开放
封闭:指的是对修改源代码封闭
装饰器就是在不修改被装饰对象源代码以及调用方式的前提为被装饰对象添加上新功能
3.如何用装饰器(装饰器推导)
初始函数(func:过3秒,打印参数值)(name:过2秒打印姓名)
import time
def func(x,y):
time.sleep(3)
print('===>',x,y)
func(1,2)
def name(x)
time.sleep(2)
print('==>',x)
name('egon')
要求:计算函数运行的时间
方法1:
def func(x, y):
time.sleep(3)
print('===>', x, y)
start_time = time.time()
func(1, 2)
end_time = time.time()
print(end_time-start_time)
单个最简单的操作,但是遇到多个函数计算时间只能一个个修改,工作量太大
方法2:
import time
def func(x, y):
time.sleep(3)
print('===>', x, y)
def outer(x):
def inner(*args,**kwargs):
start_time = time.time()
x(*args,**kwargs)
end_time = time.time()
print(end_time-start_time)
return inner
func = outer(func)#inner,且x=func
func(1,2,3,4)
将计算时间的功能写成一个函数,原函数在此函数内调用即可,做成闭包函数,原函数名就是参数,最后将func=outer(func)这里的func和第一行的func函数名是2个不同的东西,这里的func实际等于inner,为了使最后调用与原来一致故写成这样的
注意点:有些函数有return值,之前的装饰器没有写,这样会导致打印返回值时出现不同,故添加操作res = func(),return res,这样返回值就和原函数相同
语法糖:@outer 相当于在结尾写上 原函数名=装饰器名(原函数名)
推导出装饰器模板:
def outer(func):
def inner(*args,**kwargs):
res = func(*args,**kwargs)
return res
return inner
装饰器最完整的模板
from functools import wraps
def outer(func):
@wraps(func)
def inner(*args,**kwargs):
res = func(*args,**kwargs)
return res
return inner
day14
最新推荐文章于 2022-06-03 22:06:17 发布