溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python裝飾器的相關(guān)知識點有哪些

發(fā)布時間:2021-11-02 18:11:16 來源:億速云 閱讀:158 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Python裝飾器的相關(guān)知識點有哪些”,在日常操作中,相信很多人在Python裝飾器的相關(guān)知識點有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python裝飾器的相關(guān)知識點有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

    1、裝飾器

    裝飾器(Decorator):從字面上理解,就是裝飾對象的器件??梢栽诓恍薷脑写a的情況下,為被裝飾的對象增加新的功能或者附加限制條件或者幫助輸出。

    裝飾器的特點是特點是函數(shù)是作為其參數(shù)出現(xiàn)的,裝飾器還擁有閉包的特點。

    示例代碼如下所示:

    # 定義一個裝飾器
    def decorate(func):
        def wrapper():
            func()
            print("已將學(xué)生加入學(xué)校學(xué)生名單")
            print("已將學(xué)生加入系學(xué)生名單")
            print("已將學(xué)生加入班級名單")
    
        return wrapper
    
    
    @decorate
    def student():
        print("我是小花")
    
    
    student()
    '''
    ---輸出結(jié)果---
    我是小花
    已將學(xué)生加入學(xué)校學(xué)生名單
    已將學(xué)生加入系學(xué)生名單
    已將學(xué)生加入班級名單
    '''

    使用**@****符號加函數(shù)名**來裝飾一個函數(shù)

    執(zhí)行流程:因為student是被裝飾的函數(shù),系統(tǒng)將student函數(shù)以參數(shù)的形式傳入decorate函數(shù)(裝飾器decorate),執(zhí)行decorate函數(shù),并將返回值賦給student函數(shù)。

    上一段代碼等于下面這一段代碼:

    # 定義一個裝飾器
    def decorate(func):
        def wrapper():
            func()
            print("已將學(xué)生加入學(xué)校學(xué)生名單")
            print("已將學(xué)生加入系學(xué)生名單")
            print("已將學(xué)生加入班級名單")
    
        return wrapper
    
    
    def student():
        print("我是小花")
    
    
    # 將返回值傳給f 并調(diào)用
    f = decorate(student)  # 這里不能加(),不然就表示調(diào)用
    f()
    '''
    ---輸出結(jié)果---
    我是小花
    已將學(xué)生加入學(xué)校學(xué)生名單
    已將學(xué)生加入系學(xué)生名單
    已將學(xué)生加入班級名單
    '''

    如果student函數(shù)外有直接可執(zhí)行的語句,在不調(diào)用student函數(shù)的情況下,也會被執(zhí)行,

    示例代碼如下:

    # 定義一個裝飾器
    def decorate(func):
        print("這是外部的代碼")
    
        def wrapper():
            func()
            print("已將學(xué)生加入學(xué)校學(xué)生名單")
            print("已將學(xué)生加入系學(xué)生名單")
            print("已將學(xué)生加入班級名單")
    
        return wrapper
    
    
    @decorate
    def student():
        print("我是小花")
    
    
    # student()
    '''
    ---輸出結(jié)果---
    這是外部的代碼
    '''

    1.1 應(yīng)用場景

    可以用于電商網(wǎng)站的判斷用戶是否登錄來是否繼續(xù)往下執(zhí)行;添加日志等場景,

    示例代碼如下所示:

    # 定義一個裝飾器
    def decorate(func):
        def wrapper():
            func()
            print("正在檢驗用戶是否登錄")
            # if  # 判斷是否登錄的代碼塊
            #     pass
            print("用戶已登錄")
    
        return wrapper
    
    
    @decorate  # 使用裝飾器
    def add_shopping_cart():
        print("添加成功")
    
    
    @decorate  # 使用裝飾器
    def payment():
        print("付款成功")
    
    
    add_shopping_cart()
    payment()
    
    '''
    ---輸出結(jié)果---
    添加成功
    正在檢驗用戶是否登錄
    用戶已登錄
    付款成功
    正在檢驗用戶是否登錄
    用戶已登錄
    '''

    2、萬能裝飾器

    因為函數(shù)的參數(shù)可能是不固定的,所以可以通過函數(shù)的可變參數(shù)來完成這種功能。

    示例代碼如下:

    def decorate(func):
        def wrapper(*args, **kwargs):  # 使用可變參數(shù)來達(dá)到可以接受任何參數(shù)的效果
            print("正在檢測中。。。")
            print(".............")
            print("檢測完畢")
            func(*args, **kwargs)
    
        return wrapper
    
    
    @decorate  # 使用裝飾器
    def f1():  # 無參數(shù)
        print("這個沒有任何功能")
    
    
    @decorate
    def f2(name):  # 一個參數(shù)
        print("名字是:", name)
    
    
    @decorate
    def student(*students):  # 多個參數(shù)  # *students用于接收多個參數(shù)
        for ch in students:
            print(ch)
    
    
    @decorate
    def student_classroom(*students, classroom="前端班"):  # 接收可以賦值的參數(shù)
        print(f"這是{classroom}的學(xué)生")
        for ch in students:
            print(ch)
    
    
    # 調(diào)用函數(shù)
    f1()
    '''
    ---輸出結(jié)果---
    正在檢測中。。。
    .............
    檢測完畢
    這個沒有任何功能
    '''
    f2("一碗周")
    '''
    ---輸出結(jié)果---
    正在檢測中。。。
    .............
    檢測完畢
    名字是: 一碗周
    '''
    student("張三", "李四", "王五")
    '''
    ---輸出結(jié)果---
    正在檢測中。。。
    .............
    檢測完畢
    張三
    李四
    王五
    '''
    student_classroom("張三", "李四", "王五", classroom="前端班")
    '''
    正在檢測中。。。
    .............
    檢測完畢
    這是前端班的學(xué)生
    張三
    李四
    王五
    '''

    為了防止錯誤,在定義裝飾器的時候要將其設(shè)置為萬能裝飾器

    3、多層裝飾器

    多層的執(zhí)行循序執(zhí)行順序是從里到外,最先調(diào)用最里層的裝飾器,最后調(diào)用最外層的裝飾器,

    示例代碼如下所示:

    def maths(func):  # 定義第一個裝飾器
        def wrapper(*args, **kwargs):
            func(*args, **kwargs)
            print("該學(xué)生已經(jīng)學(xué)習(xí)了數(shù)學(xué)")
    
        return wrapper
    
    
    def Chinese(func):  # 定義第而個裝飾器
        def wrapper(*args, **kwargs):
            func(*args, **kwargs)
            print("該學(xué)生已經(jīng)學(xué)習(xí)了語文")
    
        return wrapper
    
    
    def English(func):  # 定義第三個裝飾器
        def wrapper(*args, **kwargs):
            func(*args, **kwargs)
            print("該學(xué)生已經(jīng)學(xué)習(xí)了英語")
    
        return wrapper
    
    
    @maths
    @English
    def student1(name):
        print(f"學(xué)生{name}已經(jīng)完成了")
    
    
    @English
    @Chinese
    @maths
    def student2(name):
        print(f"學(xué)生{name}已經(jīng)完成了")
    
    
    # 調(diào)用函數(shù)
    student1("小明")
    '''
    學(xué)生小明已經(jīng)完成了
    該學(xué)生已經(jīng)學(xué)習(xí)了英語
    該學(xué)生已經(jīng)學(xué)習(xí)了數(shù)學(xué)
    '''
    student2("小花")
    '''
    學(xué)生小花已經(jīng)完成了
    該學(xué)生已經(jīng)學(xué)習(xí)了數(shù)學(xué)
    該學(xué)生已經(jīng)學(xué)習(xí)了語文
    該學(xué)生已經(jīng)學(xué)習(xí)了英語
    '''

    4、帶參數(shù)的裝飾器

    帶參數(shù)的裝飾器一共分為三層,分別如下:

    • 第一層:負(fù)責(zé)接收裝飾器的參數(shù)

    • 第二層 :負(fù)責(zé)接收函數(shù)

    • 第三層:負(fù)責(zé)接收函數(shù)的參數(shù)

    示例代碼如下所示:

    # 裝飾器帶參數(shù)
    def outer(a):  # 第一層: 負(fù)責(zé)接收裝飾器的參數(shù)
    
        def decorate(func):  # 第二層 : 負(fù)責(zé)接收函數(shù)
    
            def wrapper(*args, **kwargs):  # 第三層   負(fù)責(zé)接收函數(shù)的參數(shù)
                for i in range(a):
                    print(i)
                func(*args, **kwargs)
    
            return wrapper  # 返出來的是:第三層
    
        return decorate  # 返出來的是:第二層
    
    
    @outer(3)
    def number():
        print("打印完畢")
    
    
    number()
    '''
    0
    1
    2
    打印完畢
    '''

    最外層的函數(shù)負(fù)責(zé)接收裝飾器參數(shù),里面的內(nèi)容還是原裝飾器的內(nèi)容。

    到此,關(guān)于“Python裝飾器的相關(guān)知識點有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI