1. Add decorators to a large number of functions, and switch from time to time
#Multiple decorators, add switch import time for batch management FLAG = False def outer(flag): def timer(f1): def inner(*args,**kwargs): if flag == True: start_time = time.time() ret = f1 (* args, ** kwargs) end_time = time.time() print ( ' Running time is %s ' % (end_time- start_time)) else : ret = f1 (* args, ** kwargs) return ret return inner return timer @outer(FLAG) def func1(a, b): print ( ' beginning of func1 -- %s ' % a) time.sleep( 0.1 ) print ( ' End of func1 -- %s ' % b) @outer(FLAG) def func2(a, b): print ( ' beginning of func2 -- %s ' % a) time.sleep( 0.1 ) print ( ' func2 ends -- %s ' % b) # func1 begins -- a # func1 ends -- b # func2 begins -- c # func2 ends -- d
2. Use a decorator for login detection
#Second case # Use the decorator for login detection, if you have already logged in, you do not need to log in again # import time login_info = {'alex':False} def login(func1): def inner(name): if login_info[name] != True: user = input('user: ') pwd = input('pwd: ') if user == 'alex' and pwd == 'alex3714': login_info[name] = True if login_info[name] == True: ret = func1(name) return ret return inner def timmer(f): def inner(*args,**kwargs): start_time = time.time() ret = f (* args, ** kwargs) end_time = time.time() print(end_time-start_time) return ret return inner @login # index = login(index) -- inner @timmer def index(name): print ( ' Welcome %s to the homepage of Blog Park--- ' % name) time.sleep(0.3) @login @timmer def manager(name): print ( ' Welcome %s to the blog garden management interface--- ' % name) time.sleep(0.3) index('alex') manager('alex') index('alex') manager('alex') # user: alex # pwd: alex3714 #Welcome alex to the blog garden homepage--- # 0.30012965202331543 #Welcome alex to the blog garden management interface--- # 0.30124926567077637 #Welcome alex to the blog garden homepage--- # 0.3006711006164551 #Welcome alex came to the blog garden management interface--- # 0.3006777763366699
3. Multiple decorators decorate a function, the structure is similar to nesting dolls
#Multiple decorators decorate a function, the structure is similar to the nesting doll structure def wrapper1(f1): # f def inner1(): print ( ' wrapper1 before func ' ) f1() # f print('wrapper1 after func') return inner1 def wrapper2(f2): #inner def inner2(): print('wrapper2 before func') f2() # inner1 print('wrapper2 after func') return inner2 #When the decorator is executed, @wrapper2 is executed from bottom to top # f = wrapper2(inner1) --> inner2 @wrapper1 # f = wrapper1 ( f ) --> inner1 def f(): print ( ' in f ' ) f() #inner2 # wrapper2 before func # wrapper1 before func # in f # wrapper1 after func # wrapper2 after func
# 运行过程 def wrapper1(f1): # 3- f1 = f def inner1(): print('wrapper1 before func') ## 14= f1() ## 15= f() print('wrapper1 after func') ## 17= return inner1 # 4- inner1 def wrapper2(f2): # 7- f2 = inner1 def inner2(): ## 11= print('wrapper2 before func') ## 12= f2() ## 13= inner1 print('wrapper2 after func') ## 18= return inner2 # 8- inner2 #When the decorator is executed, it is executed from bottom to top #When encountering multiple decorators decorating a function, it will keep going down until the decorated function is found #It is a process of going down first and then going back up @wrapper2 # 6- f = wrapper2(f ) --> f = wrapper2(inner1) # 9- f = inner2 **** End of decoration process @wrapper1 # 2- f = wrapper1(f) # 5- f = inner1 --> f def f(): # 1- start from the found f print ( ' in f ' ) # # 16= f() # 10- start calling f() which is equivalent to inner2()