进阶的需求
1、第一种情况
需要给500个函数添加装饰器,如果你逐个添加或者取消添加会非常麻烦,并且浪费成本;
现在,你可以设计你的装饰器 来确认是否生效。
1 import time 2 FLAG = True#全局变量 3 def outer(flag): 4 def timmer(f): 5 def inner(*args,**kwargs): 6 if flag == True:#如果flag为True,原有的函数前后增加功能,且不改变原函数的调用方式 7 start_time = time.time() 8 ret = f(*args,**kwargs) 9 end_time = time.time() 10 print(end_time - start_time) 11 else:#如果flag不为True,只执行原有的函数,且不改变原函数的调用方式 12 ret = f(*args, **kwargs) 13 return ret 14 return inner 15 return timmer 16 17 @outer(FLAG) # func = timmer(func) 18 def func(a,b): 19 print('begin func',a) 20 time.sleep(0.1) 21 print('end func',b) 22 return True 23 24 func(1,2) 25 26 #执行结果 27 #>>>begin func 1 28 #>>>end func 2 29 #>>>0.10027241706848145
2、第二种情况
装饰器除了可以计算函数的执行时间,还可以记录登录、记录日志等;
现在假如要访问博客园首页或其他内容的前提,需要用户先登录才能访问,设计装饰器。
1 import time 2 login_info = {'alex':False} 3 def login(func): # manager 4 def inner(name): 5 if login_info[name] != True: 6 user = input('user :') 7 pwd = input('pwd :') 8 if user == 'alex' and pwd == 'alex3714': 9 login_info[name] = True 10 if login_info[name] == True: 11 ret = func(name) # timmer中的inner 12 return ret 13 return inner 14 15 @login 16 def index(name): 17 print('欢迎%s来到博客园首页~'%name) 18 19 @login 20 def manager(name): 21 print('欢迎%s来到博客园管理页~'%name) 22 23 index('alex')#由于login_info[('alex']==Flase,所以第一次访问需要登录 24 index('alex') 25 manager('alex') 26 manager('alex') 27 28 #执行结果 29 #>>>user :alex 30 #>>>pwd :alex3714 31 #>>>欢迎alex来到博客园首页~ 32 #>>>欢迎alex来到博客园首页~ 33 #>>>欢迎alex来到博客园管理页~ 34 #>>>欢迎alex来到博客园管理页~
3、第三种情况
1)因为要用到两个装饰器,开始之前先解释一下两个装饰器装饰一个函数的执行过程:
1 def wrapper1(func): 2 def inner1(): 3 print('wrapper1 ,before func') 4 func() 5 print('wrapper1 ,after func') 6 return inner1 7 8 def wrapper2(func): 9 def inner2(): 10 print('wrapper2 ,before func') 11 func() 12 print('wrapper2 ,after func') 13 return inner2 14 15 @wrapper2 16 @wrapper1 17 def f(): 18 print('in f') 19 20 f()
2)在第二种情况的基础上还要计算函数index、manger的执行时间:
1 import time 2 login_info = {'alex':False} 3 def login(func): # manager 4 def inner(name): 5 if login_info[name] != True: 6 user = input('user :') 7 pwd = input('pwd :') 8 if user == 'alex' and pwd == 'alex3714': 9 login_info[name] = True 10 if login_info[name] == True: 11 ret = func(name) # timmer中的inner 12 return ret 13 return inner 14 15 def timmer(f): 16 def inner(*args,**kwargs): 17 start_time = time.time() 18 ret = f(*args,**kwargs) # 调用被装饰的方法 19 end_time = time.time() # 20 print(end_time - start_time) 21 return ret 22 return inner 23 24 @login 25 @timmer 26 def index(name): 27 print('欢迎%s来到博客园首页~'%name) 28 29 @login 30 @timmer # manager = login(manager) 31 def manager(name): 32 print('欢迎%s来到博客园管理页~'%name) 33 34 index('alex') 35 index('alex') 36 manager('alex') 37 manager('alex')