Chapter 5 Advanced Decorator

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()

 

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325295663&siteId=291194637