最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python裝飾器超詳細(xì)實(shí)例教程

 更新時(shí)間:2026年05月14日 10:35:20   作者:星哲最開心  
本文介紹了Python裝飾器的基本概念、用途和實(shí)現(xiàn)方法,裝飾器是一種在不修改原函數(shù)代碼的前提下,為函數(shù)動態(tài)添加功能的工具,其本質(zhì)是閉包和高階函數(shù),裝飾器可用于日志記錄、計(jì)時(shí)、權(quán)限校驗(yàn)等功能,感興趣的朋友跟隨小編一起看看吧

Python 裝飾器是在不修改原函數(shù)代碼的前提下,給函數(shù)動態(tài)添加功能的工具,本質(zhì)是閉包 + 高階函數(shù),最常用場景:日志記錄、計(jì)時(shí)、權(quán)限校驗(yàn)、緩存、事務(wù)管理等。

先搞懂 3 個(gè)基礎(chǔ)概念

裝飾器建立在這三個(gè)知識點(diǎn)之上,必須先理解:

  1. 函數(shù)是一等公民:函數(shù)可以作為參數(shù)、返回值、賦值給變量
  2. 高階函數(shù):接收函數(shù)作為參數(shù),或返回一個(gè)函數(shù)
  3. 閉包:內(nèi)部函數(shù)可以訪問外部函數(shù)的變量,且外部函數(shù)執(zhí)行完畢后變量不銷毀

最簡單的裝飾器(無參函數(shù))

手動實(shí)現(xiàn)裝飾器(理解原理)

# 定義裝飾器:接收一個(gè)函數(shù),返回一個(gè)新函數(shù)
def my_decorator(func):
    def wrapper():
        print("函數(shù)執(zhí)行前:添加額外功能")
        func()  # 調(diào)用原函數(shù)
        print("函數(shù)執(zhí)行后:添加額外功能")
    return wrapper
# 原函數(shù)
def say_hello():
    print("Hello 裝飾器!")
# 手動裝飾:不修改原函數(shù),給它加功能
say_hello = my_decorator(say_hello)
# 調(diào)用
say_hello()

輸出

函數(shù)執(zhí)行前:添加額外功能
Hello 裝飾器!
函數(shù)執(zhí)行后:添加額外功能

語法糖 @(最常用寫法)

Python 提供 @裝飾器名 簡化寫法,效果和上面完全一樣

def my_decorator(func):
    def wrapper():
        print("函數(shù)執(zhí)行前")
        func()
        print("函數(shù)執(zhí)行后")
    return wrapper
# 直接用 @ 裝飾
@my_decorator
def say_hello():
    print("Hello 裝飾器!")
say_hello()

裝飾 帶參數(shù)的函數(shù)

如果原函數(shù)有參數(shù),裝飾器內(nèi)部的 wrapper 必須能接收參數(shù),用 *args, **kwargs 通用接收:

def my_decorator(func):
    # wrapper 接收任意參數(shù),傳給原函數(shù)
    def wrapper(*args, **kwargs):
        print("執(zhí)行前")
        # 調(diào)用原函數(shù)并傳參
        result = func(*args, **kwargs)
        print("執(zhí)行后")
        # 返回原函數(shù)的返回值
        return result
    return wrapper
@my_decorator
def add(a, b):
    return a + b
print(add(10, 20))

輸出

執(zhí)行前
執(zhí)行后
30

帶參數(shù)的裝飾器(進(jìn)階)

裝飾器本身也可以接收參數(shù),需要再套一層函數(shù)

# 最外層:接收裝飾器參數(shù)
def decorator_with_param(msg):
    # 中層:真正的裝飾器
    def my_decorator(func):
        # 內(nèi)層:包裝函數(shù)
        def wrapper(*args, **kwargs):
            print(f"裝飾器參數(shù):{msg}")
            result = func(*args, **kwargs)
            return result
        return wrapper
    return my_decorator
# 使用:裝飾器帶參數(shù)
@decorator_with_param("我是自定義參數(shù)")
def test():
    print("原函數(shù)執(zhí)行")
test()

保留原函數(shù)信息(重要)

直接使用裝飾器會覆蓋原函數(shù)的名字、文檔字符串,需要用 functools.wraps 修復(fù):

import functools
def my_decorator(func):
    # 保留原函數(shù)信息
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print("前置功能")
        return func(*args, **kwargs)
    return wrapper
@my_decorator
def add(a, b):
    """兩數(shù)相加"""
    return a + b
# 打印原函數(shù)名和文檔,不會被裝飾器覆蓋
print(add.__name__)  # 輸出 add
print(add.__doc__)   # 輸出 兩數(shù)相加

實(shí)戰(zhàn):最常用的 2 個(gè)裝飾器

計(jì)時(shí)裝飾器(統(tǒng)計(jì)函數(shù)運(yùn)行時(shí)間)

import time
import functools
def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        res = func(*args, **kwargs)
        end = time.time()
        print(f"函數(shù) {func.__name__} 耗時(shí):{end - start:.4f}s")
        return res
    return wrapper
@timer
def long_task():
    time.sleep(1)
long_task()

日志裝飾器(記錄函數(shù)調(diào)用)

import functools
def logger(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print(f"調(diào)用函數(shù):{func.__name__},參數(shù):{args} {kwargs}")
        res = func(*args, **kwargs)
        print(f"函數(shù)返回:{res}")
        return res
    return wrapper
@logger
def add(a, b):
    return a + b
add(5, 3)

多個(gè)裝飾器疊加

多個(gè)裝飾器執(zhí)行順序:從下往上裝飾,從上往下執(zhí)行

def dec1(func):
    def wrapper():
        print("裝飾器1 前置")
        func()
        print("裝飾器1 后置")
    return wrapper
def dec2(func):
    def wrapper():
        print("裝飾器2 前置")
        func()
        print("裝飾器2 后置")
    return wrapper
# 執(zhí)行順序:dec1前置 → dec2前置 → 原函數(shù) → dec2后置 → dec1后置
@dec1
@dec2
def test():
    print("原函數(shù)")
test()

總結(jié)

  1. 裝飾器作用:不修改原函數(shù),動態(tài)添加功能(開閉原則)
  2. 核心結(jié)構(gòu):外層=裝飾器,內(nèi)層=包裝函數(shù)(真正執(zhí)行)
  3. 通用寫法*args, **kwargs + functools.wraps
  4. 常用場景:計(jì)時(shí)、日志、權(quán)限、緩存、路由(Flask/Django)

到此這篇關(guān)于Python裝飾器超詳細(xì)實(shí)例教程的文章就介紹到這了,更多相關(guān)Python裝飾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Pytorch各種維度變換函數(shù)總結(jié)

    Pytorch各種維度變換函數(shù)總結(jié)

    本文對于PyTorch中的各種維度變換的函數(shù)進(jìn)行總結(jié),包括reshape()、view()、resize_()、transpose()、permute()、squeeze()、unsqeeze()、expand()、repeat()函數(shù)的介紹和對比,感興趣的可以了解一下
    2024-02-02
  • IDEA創(chuàng)建python項(xiàng)目詳細(xì)圖文教程

    IDEA創(chuàng)建python項(xiàng)目詳細(xì)圖文教程

    在開始編寫Python代碼之前,需要在IDEA中配置Python環(huán)境,下面這篇文章主要給大家介紹了關(guān)于IDEA創(chuàng)建python項(xiàng)目的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • Python中跳臺階、變態(tài)跳臺階與矩形覆蓋問題的解決方法

    Python中跳臺階、變態(tài)跳臺階與矩形覆蓋問題的解決方法

    這篇文章主要給大家介紹了關(guān)于Python中跳臺階、變態(tài)跳臺階與矩形覆蓋問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • python面向?qū)ο笾衉_new__和__init__區(qū)別

    python面向?qū)ο笾衉_new__和__init__區(qū)別

    在 Python 的面向?qū)ο缶幊讨?__new__ 和 __init__ ,它們的職責(zé)、執(zhí)行順序和返回值完全不同,下面就來詳細(xì)的介紹一下兩者的區(qū)別,感興趣的可以了解下
    2026-04-04
  • Python中裝飾器兼容加括號和不加括號的寫法詳解

    Python中裝飾器兼容加括號和不加括號的寫法詳解

    這篇文章主要給大家介紹了關(guān)于Python中裝飾器兼容加括號和不加括號寫法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • pycharm終端安裝pytorch失敗的問題及解決

    pycharm終端安裝pytorch失敗的問題及解決

    這篇文章主要介紹了pycharm終端安裝pytorch失敗的問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Django初步使用Celery處理耗時(shí)任務(wù)和定時(shí)任務(wù)問題

    Django初步使用Celery處理耗時(shí)任務(wù)和定時(shí)任務(wù)問題

    這篇文章主要介紹了Django初步使用Celery處理耗時(shí)任務(wù)和定時(shí)任務(wù)問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Python輕松讀取TOML文件告別手動編輯配置文件

    Python輕松讀取TOML文件告別手動編輯配置文件

    這篇文章主要為大家介紹了Python輕松讀取TOML文件告別手動編輯配置文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Django 限制訪問頻率的思路詳解

    Django 限制訪問頻率的思路詳解

    這篇文章主要介紹了Django 限制訪問頻率的思路詳解,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • python 如何將字典寫為json文件

    python 如何將字典寫為json文件

    這篇文章主要介紹了python 如何將字典寫為json文件的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

静乐县| 翁牛特旗| 清镇市| 谷城县| 比如县| 彩票| 桦南县| 民县| 望城县| 革吉县| 普格县| 乐陵市| 惠来县| 璧山县| 阜宁县| 洪泽县| 固原市| 仲巴县| 安图县| 温泉县| 黄平县| 大安市| 普安县| 鸡东县| 淮滨县| 邢台市| 鹤山市| 阿城市| 南召县| 尚志市| 宜昌市| 惠水县| 林芝县| 共和县| 信丰县| 浮梁县| 离岛区| 沧州市| 深州市| 富裕县| 鄂托克旗|