First, the definition
An adorner is essentially a function that decorates other functions and adds additional functionality to other functions.
Second, the adorner principle
1. Cannot modify the source code of the decorated function
2. Cannot modify the calling mode of the decorated function
Third, the realization of the necessary knowledge of adorners
1. A function is a variable
1 #def foo ():2 #print ("in the Foo")3 #Bar () #bar未定义4 #foo ()5 6 7 #def Bar ():8 #print ("int the bar")9 #def foo ():Ten #print ("in the Foo") One #Bar () A #foo () - - the #def foo (): - #print ("in the Foo") - #Bar () - #def Bar (): + #print ("int the bar") - #foo ()
1 def foo (): 2 Print ("in thefoo") 3 Bar ()4foo ()5def Bar (): # after a call, the definition does not execute 6 Print ("int the bar")
2. Higher-order functions (two representations of higher-order functions)
2.1 Pass a function name as an argument to another function (add a function to it without modifying the source code of the decorated function)
1 Import Time2 3 defBar ():4Time.sleep (3)5 Print("In the bar")6 7 defTest1 (func):8Start_time =time.time ()9 func ()TenStop_time =time.time () One Print("The func run time is%s"% (stop_time-start_time)) ATest1 (BAR)
2.2 The return value contains the function name
1 Import Time2 defBar ():3Time.sleep (3)4 Print("In the bar")5 defTest2 (func):6 Print(func)7 returnFunc#return to memory address8 9 #Print (Test2 (bar))Ten #T=test2 (BAR) One #t () #run bar ABar=test2 (BAR) -Bar ()#the returned memory address plus () can be executed
3. Nesting functions
1x=02 defA ():3X=14 defb ():5x=26 defC ():7X=38 Print(x)9 C ()TenB ()#if B () is not executed here, then the function is equal to nothing, because there is no print OneA ()
Decorator = higher order function + nested function
1 Import Time2 3 defTimer (func):#timer (test) Func=test4 defdeco ():5Start_time =time.time ()6Func ()#The decorated function test is run here7Stop_time =time.time ()8 Print("Func Run time is%s"% (stop_time-start_time))9 returnDeco#returns the memory address of DecoTen One A@timer#equivalent to Timer=timer (test), the adorner is always placed before the decorated function - defTest (): -Time.sleep (3) the Print("This is test") - -Test ()
V. If the function of the adorner contains parameters
1 Import Time2 3 defTimer (func):4 defDeco (*args,**kwargs):#*args,**kwargs means that the parameter is indeterminate5Start_time=time.time ()6Func (*args,**Kwargs)7Stop_time=time.time ()8 Print("In the run time is %s"% (stop_time-start_time))9 returndecoTen One@timer#test2 = Timer (test2) = Deco test2 (name) = Deco (name) A deftest2 (age,name,job): -Time.sleep (1) - Print("test2:", Age,name,job) the -Test2 (23,"Irlo","Seller")
Vi. examples of use of adorners
Suppose you add a login verification for a Web page
1USER,PASD ="Irlo","12345"2 defAuth (auth_type):3 Print("auth func is", Auth_type)4 defType (func):5 defwrapper ():6 ifAuth_type = ="Local":7Username = input ("Username:"). Strip ()#strip remove characters from the end of a string (the default is a space)8Password = input ("Password:"). Strip ()9 ifUser==username andpasd==Password:Ten Print("\033[1;32;1mauthority of account\033[0m")#highlighted format (\033[display; foreground color; background colour m) OneRes=func ()#Assign the result to a variable before calling home with results A Print("After authentication") - returnRes#If you do not return, the equivalent of execution is finished, no return value is a null value - Else: the Print("Invalid username or password") - elifAuth_type = ="LDAP": - Print("I just know local,fuck off") - returnwrapper + returntype - + defindex (): A Print("Welcome to Index page") at -@auth (Auth_type ="Local") - defHome (): - Print("Welcome to Home Page") - return "From home" - in@auth (Auth_type ="LDAP") - defBBS (): to Print("Welcome to BBS page") + - index () the Print(Home ())#calling home is the equivalent of calling wrapper * Home () $BBS ()
Python 3 Learning Note (vi)----decorator