裝飾器是python中的進階用法,應用範圍非常廣泛,作為數據分析師,我們要功課之一難題,很多人都覺得裝飾器難以理解,以至于不敢去嘗試,難以突破瓶頸。今天,我将帶領大家由淺入深的理解裝飾器,并且掌握裝飾器在工作中的應用。
1、簡單裝飾器
def check(func): def wrapper(): print('this is check') func() return wrapper @check def hello(): print('hello wrapper') hello()
輸出:
this is check hello wrapper
直接看代碼,執行hello函數之前,裝飾器首先打印出了 this is check。
2、帶有參數的裝飾器
def check(func): def wrapper(word): print('this is check') func(word) return wrapper @check def hello(word): print('hello {0}'.format(word)) hello('every one')
輸出:
this is check hello every one
我們更進一步,如果原函數當中帶有參數,我們對應的也應該在裝飾器中加入參數。
這時候又有新的問題了,如果有兩個原函數同時使用了一個裝飾器,但兩個原函數的參數不同,我們上面這種寫法就無法滿足情況了,所以我們引入了一種新的寫法:
def check(func): def wrapper(*args, **kwargs): print('this is check') func(*args, **kwargs) return wrapper
關于*args, **kwargs的使用,在這裡就不再贅述了,我之前的文章中有詳細的介紹。
3、裝飾器的嵌套
我們先來看一個現象:
def check1(func): def wrapper(*args, **kwargs): print('this is check 1') func(*args, **kwargs) return wrapper def check2(func): def wrapper(*args, **kwargs): print('this is check 2') func(*args, **kwargs) return wrapper @check2 @check1 def hello(word): print('hello {0}'.format(word)) hello('every one')
輸出:
this is check 2 this is check 1 hello every one
在這裡我們可以看到,一個函數可以被多個裝飾器裝飾,并且是從上往下運行。
4、裝飾器的實際用途
4.1、身份認證
舉個例子,比如說我們要根據部門,批量給公司的員工發郵件,為了防止發給給其他部門的人,就需要先驗證郵箱是否處于目标部門:
def check(func): def wrapper(*args, **kwargs): user = args[0] if user in department: return func(*args, **kwargs) else: raise Exception('user is not in department') return wrapper @check def send_email(user_email, ...): ...
上面的簡單示例,是先定義一個check裝飾器,如果send_email中的參數user_email不在department中,就抛出一個錯誤,提醒我們去核查用戶郵箱。
4.2 日志記錄
日志記錄中也常常需要用到裝飾器,比如說随着業務量的增大,我們的方法越來越多,但也導緻了整個系統越來越慢,這時候需要檢查一下到底哪個方法執行的最慢,所以我們需要給函數加上裝飾器,記錄程序執行時間的長短;
def check(func): def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(end-start) return result return wrapper @check def program(): ...
4.3 輸入合理性檢查
作為數據分析師,我們那面要跟sql打交道,尤其是在寫腳本的時候,有時候因為sql的錯誤耽誤大量時間,所以我們可以用裝飾器,來對sql進行檢查,看看是否有語法錯誤,下面給一個簡單的示例:
def check(func): def wrapper(*args, **kwargs): sql = args[0] if sql is reasonable: return func(*args, **kwargs) else: raise Exception('sql is error') return wrapper @check def get_sql(sql): ...
以上就是關于裝飾器的内容,希望大家在工作中多多使用,刻意練習。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!