1.什么是装饰器
装饰器指的是为被装饰对象(别人)添加新功能的工具
装饰器本身可以是任意可调用对象
被装饰器对象也可以是任意可调用对象
2.为何要用装饰器
开放封闭原则:指的是对修改封闭,对扩展开放
装饰器的实现原则:
1.不能修改被装饰对象的源代码
2.不能修改被装饰对象的调用方式
装饰器的目的
就是在遵循原则1和2的前提下为被装饰对象添加新功能
如何用
import time
def index():
time.sleep(1)
print('index page')
def calc(func):
def wrapper():
start = time.time()
func()
stop = time.time()
print('用时:',stop - start)
return wrapper
index = calc(index) #把wrapper这个函数名返回给
index()
以上calc就是一个装饰器,用来给index增加新功能
但是这还不够,如果原函数有返回值,或者有有参数传进来,就会有问题,
所以wrapper的形式要尽量做到像原函数
装饰器的基本模版
def new_func(func)
def wrapper(*args,**kwargs):#把wrapper定义成可以接受任何格式参数
#新增功能的代码
res = func(*args,**kwargs) #把用户调用新函数wrapper带来的参数原封不动给到func,就和调用原函数一样,并拿到函数的返回值
return res #如果原函数有返回值,那新函数也有返回值
return wrapper #把添加好新功能的函数名返回,方便下次偷梁换柱的调用
@new_func #这是装饰器的语法糖,写在要装饰对象的正上方定格写,相当于把接下来的函数名当作参数传给new_func,在赋值给函数名 login = new_func(login)
def login():
print(‘login’)