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

Python裝飾器詳情

 更新時間:2021年11月01日 17:11:27   作者:一碗周  
這篇文章主要介紹了Python裝飾器,裝飾器Decorator從字面上理解,就是裝飾對象的器件,其的特點是特點是函數(shù)是作為其參數(shù)出現(xiàn)的,裝飾器還擁有閉包的特點,下面來看看文中的具體內(nèi)容

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)Python裝飾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python妹子圖簡單爬蟲實例

    python妹子圖簡單爬蟲實例

    這篇文章主要介紹了python妹子圖簡單爬蟲,實例分析了Python爬蟲程序所涉及的頁面源碼獲取、進(jìn)度顯示、正則匹配等技巧,需要的朋友可以參考下
    2015-07-07
  • python腳本框架webpy模板控制結(jié)構(gòu)

    python腳本框架webpy模板控制結(jié)構(gòu)

    這篇文章主要為大家介紹了python腳本框架webpy模板控制結(jié)構(gòu)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • Python實現(xiàn)圖數(shù)據(jù)處理的完整指南

    Python實現(xiàn)圖數(shù)據(jù)處理的完整指南

    圖是一種非常重要的數(shù)據(jù)結(jié)構(gòu),在Python中,我們可以使用鄰接矩陣來表示圖,這篇文章主要為大家介紹了Python實現(xiàn)圖數(shù)據(jù)處理的相關(guān)知識,需要的可以參考下
    2024-04-04
  • 利用Python展示文件下載進(jìn)度條

    利用Python展示文件下載進(jìn)度條

    這篇文章主要介紹了Python展示文件下載進(jìn)度條,requests庫相信大家都用過,做接口測試少不了它。其實我們平時下載文件,也可以用requests做到的,通過一些地址,下面我們就來看看具體是什么樣的地址及詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • Python實現(xiàn)決策樹C4.5算法的示例

    Python實現(xiàn)決策樹C4.5算法的示例

    本篇文章主要介紹了Python實現(xiàn)決策樹C4.5算法的示例,詳解的介紹了決策樹C4.5算法的原理和實現(xiàn)代碼,非常具有實用價值,需要的朋友可以參考下
    2018-05-05
  • python 3.7.0 下pillow安裝方法

    python 3.7.0 下pillow安裝方法

    這篇文章主要為大家詳細(xì)介紹了python 3.7.0 下pillow的安裝方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Python創(chuàng)建xml文件示例

    Python創(chuàng)建xml文件示例

    這篇文章主要介紹了Python創(chuàng)建xml文件的方法,結(jié)合實例形式分析了Python針對xml格式數(shù)據(jù)及文件讀寫相關(guān)操作技巧,需要的朋友可以參考下
    2017-03-03
  • Python中的遠(yuǎn)程調(diào)試與性能優(yōu)化技巧分享

    Python中的遠(yuǎn)程調(diào)試與性能優(yōu)化技巧分享

    Python 是一種簡單易學(xué)、功能強大的編程語言,廣泛應(yīng)用于各種領(lǐng)域,包括網(wǎng)絡(luò)編程、數(shù)據(jù)分析、人工智能等,在開發(fā)過程中,我們經(jīng)常會遇到需要遠(yuǎn)程調(diào)試和性能優(yōu)化的情況,本文將介紹如何利用遠(yuǎn)程調(diào)試工具和性能優(yōu)化技巧來提高 Python 應(yīng)用程序的效率和性能
    2024-05-05
  • 利用Python實現(xiàn)從PDF到CSV的轉(zhuǎn)換

    利用Python實現(xiàn)從PDF到CSV的轉(zhuǎn)換

    將PDF轉(zhuǎn)換為CSV極大地提升了數(shù)據(jù)的實用價值,Python作為一種強大的編程語言,能夠高效完成這一轉(zhuǎn)換任務(wù),本文將介紹如何利用Python實現(xiàn)從PDF到CSV的轉(zhuǎn)換,需要的朋友可以參考下
    2024-07-07
  • Python?數(shù)據(jù)庫操作SQL基礎(chǔ)

    Python?數(shù)據(jù)庫操作SQL基礎(chǔ)

    在本章節(jié)中,我們將討論?Python?數(shù)據(jù)庫操作的基礎(chǔ)知識,重點關(guān)注?SQL即Structured?Query?Language,結(jié)構(gòu)化查詢語言,SQL?是用于管理關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn)編程語言,可以用來執(zhí)行數(shù)據(jù)定義、數(shù)據(jù)操作和數(shù)據(jù)控制等任務(wù)
    2023-06-06

最新評論

蕲春县| 新化县| 云梦县| 汉源县| 肥城市| 洪泽县| 额敏县| 玉龙| 东兰县| 通州市| 扶绥县| 望都县| 克拉玛依市| 平定县| 彭州市| 巩留县| 甘孜| 凤阳县| 乌鲁木齐市| 奉贤区| 济阳县| 雷波县| 兴义市| 浮山县| 奈曼旗| 乌兰察布市| 田林县| 通江县| 江川县| 中江县| 昂仁县| 安国市| 白水县| 招远市| 巴林右旗| 福州市| 宜丰县| 广南县| 萍乡市| 卢龙县| 丹江口市|