tft每日頭條

 > 科技

 > python裝飾器高級用法

python裝飾器高級用法

科技 更新时间:2025-01-07 18:45:41

裝飾器是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): ...

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

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved