尝试:装饰器分为有参数和无参数,装饰器就是闭包的使用。
注:关于闭包:在17-python知识点补充【小知识,面试中可能会考】中第17个小点。
补充:软件上新后,我们需要:不修改源代码、不修改调用方式,在此基础上扩展新功能。
#常见的装饰器的形式
def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
常见装饰器:
1、计时装饰器:
#计时装饰器 import time def timmer(func): def wrapper(*args,**kwargs): start=time.time() res=func(*args,**kwargs) stop=time.time() spend=stop-start print('花费时间{}'.format(round(spend,4))) return res return wrapper @timmer #使得下面的函数名当做参数传给装饰器 等价于 index=timmer(index) def index(): time.sleep(3) print('welcome to index page!') return 123 print(index()) @timmer #使得下面的函数名当做参数传给装饰器 等价于 home=timmer(home) def home(): time.sleep(3) print('welcome to my home page!') return 456 print(home())
结果显示:
welcome to index page! 花费时间3.0 123 welcome to my home page! 花费时间3.0001 456
2、认证装饰器
#认证装饰器 import time def auth(func): name=input('请输入姓名:').strip() pwd=input('请输入密码:').strip() def wrapper(*args,**kwargs): if name=='psy' and pwd=='123': print('登陆成功,正在加载内容~~~') time.sleep(3) #延迟,假装数据加载 res=func(*args,**kwargs) return res else: print('登录失败') return wrapper @auth #等价于index=auth(index) def index(): time.sleep(1) print('welcome to indec page!') return 123 print(index())
结果显示:
请输入姓名:psy 请输入密码:123 登陆成功,正在加载内容~~~ welcome to indec page! 123
3、装饰器叠加使用【将计时器、认证器叠加使用】
注:==》计时器的时间【与两者位置摆放有关!】
#首先写好计时器和认证器
import time def timmer(func): #计时器 def wrapper(*args,**kwargs): start=time.time() res=func(*args,**kwargs) stop=time.time() spend=stop-start print('花费时间{}'.format(round(spend,4))) return res return wrapper def auth(func): #认证器 name=input('请输入姓名:').strip() pwd=input('请输入密码:').strip() def wrapper(*args,**kwargs): if name=='psy' and pwd=='123': print('登入成功,正在缓冲!') time.sleep(2) res=func(*args,**kwargs) return res else: print('登录失败!') return wrapper
(1)计时器在上,认证器在下
@timmer #此时计时器统计的是:auth和index的时间 @auth def index(): time.sleep(3) print('welcom to index page!') return 123 print(index())
结果显示:
请输入姓名:psy 请输入密码:123 登入成功,正在缓冲! welcom to index page! 花费时间5.0008 123
(2)计时器在下,认证器在上
@auth @timmer #此时计时器统计的是index的时间 def index(): time.sleep(3) print('welcom to index page!') return 123 print(index())
结果显示:
请输入姓名:psy 请输入密码:123 登入成功,正在缓冲! welcom to index page! 花费时间3.0009 123