首页
/
每日頭條
/
科技
/
python裝飾器高級用法
python裝飾器高級用法
更新时间:2024-10-01 17:21:28

裝飾器是python中的進階用法,應用範圍非常廣泛,作為數據分析師,我們要功課之一難題,很多人都覺得裝飾器難以理解,以至于不敢去嘗試,難以突破瓶頸。今天,我将帶領大家由淺入深的理解裝飾器,并且掌握裝飾器在工作中的應用。

python裝飾器高級用法(一文搞懂python中最強大的裝飾器)1

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的使用,在這裡就不再贅述了,我之前的文章中有詳細的介紹。

python裝飾器高級用法(一文搞懂python中最強大的裝飾器)2

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

在這裡我們可以看到,一個函數可以被多個裝飾器裝飾,并且是從上往下運行。

python裝飾器高級用法(一文搞懂python中最強大的裝飾器)3

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): ...

以上就是關于裝飾器的内容,希望大家在工作中多多使用,刻意練習。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
建築設備工程技術專業就業方向與就業前景怎麼樣
建築設備工程技術專業就業方向與就業前景怎麼樣
高考填報志願時,建築設備工程技術專業就業方向有哪些以及就業前景怎麼樣是廣大考生和家長朋友們十分關心的問題,以下是整理的建築設備工程技術專業簡介、就業方向、就業前景等信息,供大家參考。1、建築設備工程技術專業簡介建築設備工程技術專業培養從事工業與民用設備安裝工程施工設計、安裝工藝設計、設備調試及施工管...
2024-10-01
電腦對比度怎麼調
電腦對比度怎麼調
演示機型:華為MateBookX系統版本:win764位旗艦版1、點擊開始菜單裡的“控制面闆”選項。2、先切換至大圖标顯示方式,點擊控制面闆裡的“NVIDIA控制面闆”選項。3、點擊左側“顯示”菜單下的“調整桌面顔色設置”選項。4、在顔色設置頁面下,就可以拖動對比度的滑塊來設置屏幕的對比度。
2024-10-01
水質科學與技術專業就業方向與就業前景怎麼樣
水質科學與技術專業就業方向與就業前景怎麼樣
高考填報志願時,水質科學與技術專業就業方向有哪些以及就業前景怎麼樣是廣大考生和家長朋友們十分關心的問題,以下是整理的水質科學與技術專業簡介、就業方向、就業前景等信息,供大家參考。1、水質科學與技術專業簡介水質科學與技術專業培養學生具有化學、化工、材料、計算機、儀器儀表和自動控制等學科寬厚的理論基礎、...
2024-10-01
2022女生适合學的技術 女生學什麼好
2022女生适合學的技術 女生學什麼好
2022女生可以選擇民航管理技術,國内主流航空公司優秀空乘人員平均年薪在幾十萬元人民币,國外航空公司空乘人員的薪資水平更高。就民航管理專業學生就業情形來看,薪資普遍較高并受到用人單位的廣泛好評。2022女生适合的專業金融專業金融專業一直被調侃是有錢人學的專業,其實不然,隻是若你選擇了該專業,未來擁有...
2024-10-01
手機連不上無線網怎麼辦
手機連不上無線網怎麼辦
1、打開手機WiFi設置,選擇你想連的WiFi,點擊左邊的箭頭。2、進入之後向下拉,點擊代理,把代理...
2024-10-01
Copyright 2023-2024 - www.tftnews.com All Rights Reserved