」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 了解 Python 裝飾器:深入探討

了解 Python 裝飾器:深入探討

發佈於2024-11-08
瀏覽:211

Python 裝飾器是強大的工具,允許我們修改或增強函數或方法的行為。常見用例包括日誌記錄、授權等。
然而,當被要求定義裝飾器時,許多人可能會說,

它是函數的包裝器。

雖然這在技術上是正確的,但幕後還發生了更多事情。

剖析一個簡單的裝飾器
讓我們探討一個簡單的例子:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before calling the function")
        result = func(*args, **kwargs)
        print("After calling the function")
        return result
    return wrapper

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")

這裡,my_decorator是函數say_hello的裝飾器。當定義say_hello時,它會自動傳遞給my_decorator,將函數呼叫轉換為:
say_hello = my_decorator(say_hello)

這種轉變何時發生?
這種轉換發生在程式碼編譯期間,特別是當函數定義時,而不是在執行時。

反組譯碼
要了解裝飾器如何在較低層級運作,我們可以使用 dis 模組來檢查裝飾函數的字節碼:

import dis

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")

dis.dis(say_hello)

字節碼細分

dis.dis(say_hello) 的輸出可能如下所示:

Understanding Python Decorators: A Deep Dive
字節碼解釋

  1. 呼叫函數之前

    • LOAD_GLOBAL:載入列印功能。
    • LOAD_CONST:載入訊息「呼叫函數之前」。
    • CALL_FUNCTION:呼叫列印。
    • POP_TOP:丟棄回傳值。
  2. 呼叫原函數

    • LOAD_DEREF:載入閉包捕獲的原始函數(func)。
    • LOAD_FAST:載入位置和關鍵字參數。
    • BUILD_MAP:為關鍵字參數建立一個新字典。
    • CALL_FUNCTION_EX:使用參數呼叫原始函數。
    • STORE_FAST:將結果儲存在局部變數中。
  3. 呼叫函數後

    • 與第一部分類似,呼叫print輸出'呼叫函數後'。
    • 回傳結果
    • 載入結果變數並傳回它。

結論
Python 裝飾器不僅僅是函數包裝器;它們使我們能夠在定義時修改函數行為。透過了解它們的工作原理並檢查字節碼,我們可以在專案中更有效地使用裝飾器。

現在就這樣!如果您還希望我深入了解其他內容,請告訴我!

版本聲明 本文轉載於:https://dev.to/aman-giri/understanding-python-decorators-a-deep-dive-pp0?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3