裝飾器--函數

裝飾器,主要是要了解裝飾的是執行過程。函數

 1 # 高級裝飾器
 2 def fun1():
 3     print("fun1")
 4 
 5 def fun2():
 6     print("fun2")
 7 
 8 def Filter(f1,f2):      # 1.2 f1=fun1   f2=fun2
 9     def outer(main_fun):    # 三、outer(login)     main_fun = login  返回inner
10         def inner(*args,**kwargs):
11             f1()
12             main_fun(*args,**kwargs)
13             f2()
14         return inner
15     return outer
16 
17 # 1.1 、先執行Filter(fun1,fun2),返回outer,變成@outer
18 @Filter(fun1,fun2)      # @outer
19 def login(what):            # def login():   # 二、login = outer(login)  # 四、 login = inner
20     print("login%s"%what)
21 
22 login()     # 五、執行inner

執行結果:

  fun1
  login能夠了
  fun2spa

第一步:執行第18行,執行Fiter(fun1,fun2)這個函數,將fun一、fun2的地址分別傳遞給f1和f2,返回outer函數的地址給第18行的Filter(fun1,fun2),這樣@Filter(filter(fun1,fun2)就變成了@outer。code

第二步:根據裝飾器的語法,第18行和第19行能夠理解爲 login = outer(login),這樣就會執行outer(login),把login地址傳遞給outer(main_fun)中的main_fun,並執行outer(main_fun),而後返回inner地址,全部login = innerblog

第三步:執行第22行login(),這裏其實就是執行inner(),執行inter()函數裏面那就是執行f1()也就是fun1()、f2()也就是fun2()、main_fun()也就是最原始的login()it

相關文章
相關標籤/搜索