python學習之路:十二.裝飾器
阿新 • • 發佈:2022-01-10
一.裝飾器的簡易版本
# 統計函式的執行時間 import time def index(): time.sleep(2) print('from index') def home(): time.sleep(3) print('from home') def outer(func): # func = index def get_time(): # 1. 統計一下函式執行前的時間戳 start_time = time.time() func() # 2. 統計一下函式執行完之後的時間戳end_time = time.time() # 3. 計算差值 print('函式執行時間:%s' % (end_time - start_time)) return get_time index = outer(index) # res=>get_time的記憶體地址 index() # get_time()
二.裝飾器進階版本
def outer(func): # func = index def get_time(*args, **kwargs): # 1. 統計一下函式執行前的時間戳start_time = time.time() func(*args, **kwargs) # login() # 2. 統計一下函式執行完之後的時間戳 end_time = time.time() # 3. 計算差值 print('函式執行時間:%s' % (end_time - start_time)) return get_time login = outer(login) # res=>get_time的記憶體地址 login('ly') # get_time()index=outer(index) index()
三.解決函式返回值的問題
def login(name): time.sleep(1) print('from home', name) return 'from login' def outer(func): # func = index def get_time(*args, **kwargs): # 1. 統計一下函式執行前的時間戳 start_time = time.time() res=func(*args, **kwargs) # login() # 2. 統計一下函式執行完之後的時間戳 end_time = time.time() # 3. 計算差值 print('函式執行時間:%s' % (end_time - start_time)) return res return get_time login = outer(login) # res=>get_time的記憶體地址 res=login('ly') # get_time() print(res)
四.裝飾器固定模板
def outer(func): def inner(): print('函式執行之前要執行的程式碼') res = func() print('函式執行之後要執行的程式碼') return res return inner
五.裝飾器的語法糖
def outer(func): def inner(): start_time = time.time() res = func() end_time = time.time() print('函式執行時間:%s' % (end_time - start_time)) return res return inner # 統計函式的執行時間 @outer # # index = outer(index) def index(): time.sleep(3) print('from index') index() ''' 裝飾器語法糖的執行流程: 把語法糖下面緊貼著的函式名當成引數傳遞給裝飾器函式引數 ''' @outer # home = outer(home) def home(): print('from home') home()
六.裝飾器雙層語法糖
# 統計函式執行時間的裝飾器 import time def get_time(func): def inner(): start_time = time.time() res = func() end_time = time.time() print('函式執行時間:%s' % (end_time - start_time)) return res return inner # 認證裝飾器 def login_auth(func): # func = index def auth(): # 1. 讓使用者輸入使用者名稱和密碼 username = input('username:').strip() password = input('password:').strip() # 2. 判斷使用者名稱和密碼 if username == 'ly' and password == '123': func() # inner() else: print('輸入錯誤,不能呼叫函式') return auth # 一定別忘記把內層函式的函式名返回出去 @login_auth # index=login_auth(inner) #index=>auth的記憶體地址 @get_time # inner=get_time(index) def index(): # def auth() time.sleep(2) print('from index') index() # auth()
七.有參裝飾器
# 認證裝飾器 def outter(source_data, a, b,c): # source_data = 'file' def login_auth(func): # func = index def auth( *args, **kwargs): # 1. 讓使用者輸入使用者名稱和密碼 # username = input('username:').strip() # password = input('password:').strip() if source_data == 'file': print('從檔案中讀資料') elif source_data =='mysql': print('從mysql中讀取資料') elif source_data == 'oracle': print('從oracle中讀取資料') return auth # 一定別忘記把內層函式的函式名返回出去 return login_auth @outter('file', 1, 2,3) # outter('file') @login_auth def index(): pass index()