Python裝飾器原理 Python裝飾器典型應用場景說明

裝飾器是python中用于修改或增強函數行為的特殊函數,其核心原理基于高階函數特性。1.權限控制:通過login_required裝飾器統一處理用戶登錄驗證邏輯;2.日志記錄:使用log_call裝飾器自動打印函數調用信息;3.性能測試:利用timer裝飾器統計函數執行時間;4.緩存優化:通過lru_cache減少重復計算提高效率。這些應用使代碼更簡潔、復用性更高且易于維護。

Python裝飾器原理 Python裝飾器典型應用場景說明

裝飾器本質上是一個函數,用來修改其他函數或類的行為,而無需修改它們的源代碼。它的核心原理是利用了 python 的高階函數特性,把一個函數作為參數傳給另一個函數,然后返回一個新的函數。

裝飾器的典型應用場景包括權限校驗、日志記錄、性能測試、緩存機制等。下面從幾個常見場景出發,說明裝飾器的使用方式和背后邏輯。


權限控制:限制某些用戶訪問特定功能

在開發 Web 應用或者后臺系統時,經常需要判斷當前用戶是否有權限執行某個操作。這時候就可以用裝飾器統一處理權限邏輯。

立即學習Python免費學習筆記(深入)”;

比如,寫一個簡單的 login_required 裝飾器:

def login_required(func):     def wrapper(user, *args, **kwargs):         if user.is_authenticated:             return func(user, *args, **kwargs)         else:             print("請先登錄")     return wrapper

然后在視圖函數上加上這個裝飾器:

@login_required def Access_profile(user):     print(f"歡迎 {user.name}")

這樣就不需要每個函數里都寫一遍登錄判斷邏輯。這種做法讓業務邏輯更清晰,也更容易維護。


日志記錄:追蹤函數調用過程

很多程序都需要記錄函數被調用的時間、參數、結果等信息。裝飾器非常適合做這類“附加”工作。

可以寫一個簡單的日志裝飾器:

def log_call(func):     def wrapper(*args, **kwargs):         print(f"調用函數 {func.__name__},參數: {args}, {kwargs}")         result = func(*args, **kwargs)         print(f"{func.__name__} 返回值: {result}")         return result     return wrapper

使用起來也很方便:

@log_call def add(a, b):     return a + b

運行 add(3, 5) 會自動打印出調用信息。這種方式對調試和監控很有幫助。


性能測試:統計函數執行時間

有時候想知道某段代碼運行多長時間,也可以用裝飾器來實現。

寫一個計時裝飾器:

import time  def timer(func):     def wrapper(*args, **kwargs):         start_time = time.time()         result = func(*args, **kwargs)         duration = time.time() - start_time         print(f"{func.__name__} 執行耗時: {duration:.4f} 秒")         return result     return wrapper

應用到任意函數上就能看到執行時間:

@timer def slow_function():     time.sleep(1)
  • 可以用于分析瓶頸函數
  • 對比不同算法性能
  • 監控接口響應時間

緩存優化:減少重復計算

對于一些計算量大但輸入輸出固定的函數,可以用裝飾器緩存結果,避免重復執行。

Python 標準庫中的 functools.lru_cache 就是一個很好的例子:

from functools import lru_cache  @lru_cache(maxsize=None) def fib(n):     if n < 2:         return n     return fib(n-1) + fib(n-2)

這個裝飾器會把之前的調用結果緩存下來,下次遇到相同參數就直接返回結果,大大提升效率。

你也可以自己實現一個簡單版本的緩存裝飾器,理解其內部機制。


基本上就這些。裝飾器雖然看起來有點繞,但只要理解它本質是函數包裝的過程,用起來其實很自然。關鍵是在合適的地方使用,別濫用就行。

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享