python裝飾器之中級篇
阿新 • • 發佈:2019-01-28
# Author Richard_Kong # !/usr/bin/env python # --*-- encoding:utf-8 --*-- """ 如果函式帶有返回值,怎麼辦? 這就是更高階的裝飾器: 1、帶引數的裝飾器: @auth(auth_type="local") 此時它是一個函式,這種情況下 由於帶有括號,會立即執行,但是隻要它的返回值是一個裝飾器就沒問題 2、基於類的裝飾器 和 帶引數的類的裝飾器 什麼是裝飾器呢: 裝飾器:外部函式傳入被裝飾函式名,內部函式返回裝飾函式名 特點:1、不修改被裝飾函式的名稱,2、不修改被裝飾函式的原始碼 home = timmer(home),等式右側返回的是wrapper的記憶體地址,再將其賦值給home,這裡的home不再是 原來的那個函式,而是被裝飾以後的函式 像home = timmer(home)這樣的寫法,python給了我們特定的語法,@語法糖 如果一個函式被多個裝飾器修飾。那它的執行順序是由下到上 """ def auth(auth_type): print("auth_type:::",auth_type) def outer_wrapper(func): def wrapper(*args,**kwargs): if auth_type=="local": username = input("please input username:") password = input("Please input password:") if username == "richard_kong" and password == "abs123": print("login successful") func() else: exit("username or password is wrong!!") elif auth_type =="lapd": print("搞毛線lapd......不會!") return wrapper return outer_wrapper @auth(auth_type="local") def home(): # home = auth(home) print("from home !!!") def abs(): print("from abs!!!") def login(): print("from abs!!!") home()