首页
/
每日頭條
/
科技
/
python裝飾器高級用法
python裝飾器高級用法
更新时间:2025-09-15 11:42:40

裝飾器是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
推荐阅读
我的世界手機國際服怎麼下載
我的世界手機國際服怎麼下載
我的世界手機國際服怎麼下載?以蘋果手機為例,下載我的世界國際版首先需要你有一個國際區的appleID,切換到國際區商店下載首先點擊設置,進入設置界面,點擊上面的賬戶,賬戶界面點擊iTunesstore與appstore,進入商店界面,點擊上...
2025-09-15
有啥比較好用的手機浏覽器
有啥比較好用的手機浏覽器
不知道屏幕前的你,有沒有聽說過聽說過這句話:「有病問某度,走上不歸路」。又或者有過這種經曆:「某度搜索,不良網站随便彈、不良app随意下」。很明顯,現在人盡皆知的某度浏覽器已經不管用了。沒有了某度,那我們安卓手機還有什麼浏覽器可以「依靠」的...
2025-09-15
海信電視開機一直進不了系統
海信電視開機一直進不了系統
海信電視開機一直進不了系統?晚上下班突然聽見父親說家裡海信電視開機總是開機畫面之後沒反應…下午還看得好好的…這個故障問題一般兩種問題,輕則是系統崩盤導緻跟電腦手機開機能否進去系統是一個道理重則是内部主闆出了問題,下面我們就來說一說關于海信電...
2025-09-15
oppor9s現在好用嗎
oppor9s現在好用嗎
今天我們就來聊聊我手中的這部R9s,抛下既定的主觀來區别對待這部OPPO手機,體驗是否真如想象般那麼出色。1.外觀與設計機身頂部左側是一顆麥克風,電源鍵與音量鍵的位置分布類似iPhone分别位于機身的左側和右側,底部從左到右分别為耳機孔、麥...
2025-09-15
手機為什麼發短信出去。别人收不到
手機為什麼發短信出去。别人收不到
手機為什麼發短信出去。别人收不到?欠費停機(打客服電話咨詢一下),我來為大家講解一下關于手機為什麼發短信出去。别人收不到?跟着小編一起來看一看吧!手機為什麼發短信出去。别人收不到欠費停機(打客服電話咨詢一下)。手機顯示已發送,但是對方手機遲...
2025-09-15
Copyright 2023-2025 - www.tftnews.com All Rights Reserved