亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

python中裝飾器是什么

發布時間:2020-08-14 09:13:10 來源:億速云 閱讀:87 作者:小新 欄目:編程語言

這篇文章主要介紹了python中裝飾器是什么,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

合理使用裝飾器可以簡化開發,并且使得代碼更加清晰。下面我們分別介紹兩種裝飾器,不帶參數的裝飾器和帶參數的裝飾器。

一、不帶參數的裝飾器

我們用一個實際的例子來引入裝飾器的概念,比如我們現在有一個方法A(),然后我們需要在方法A()執行之前在終端打印"function is running",這時候我們可以在方法A()的開始部分加上下面的代碼:

print("function is running")

但是如果我們不想修改方法A()的代碼,也可以重新寫一個方法decorator(),然后把A()作為入參,代碼如下:

def decorator(fun):
    @functools.wraps(fun)
    def wrapper(*args, **kwargs):
        print("Method is running")
        return fun()
    return wrapper

python中的方法可以作為參數傳入另一個方法,所以當我們執行decorator(A)的時候,返回的是一個方法,這個方法的本質是先執行print語句,然后再執行A()。

但是這樣我們的調用代碼就需要進行修改,也就是說之前調用方法A(),現在的寫法是調用decorator(A)(),為了不影響調用的代碼,我們使用python的語法糖改造方法A()的代碼。

@decorator
def A():
    # do something

實際上只是在A()的前面加上一行@decorator,這樣在我們的調用代碼就不需要改變了。

裝飾器中的@functools.wraps(fun)是為了保證返回的方法__name__屬性和入參方法fun的__name__屬性相同。

二、帶入參的裝飾器

在上面不帶參數的裝飾器中,我們實現了在執行方法A()之前打印一行固定的字符串,如果我們想要打印不同的字符串就需要用帶參數的裝飾器。實際上就是在不帶參數的裝飾器上再封裝一層即可,代碼如下:

def decorator_par(name):
    def decorator(fun):
        @functools.wraps(fun)
        def wrapper(*args, **kwargs):
            print("Method {} is running".format(name))
            return fun()
        return wrapper
    return decorator

這樣我們就可以在使用裝飾器的時候設置參數name,實現打印不同的信息。完整的代碼如下:

import functools
 
def decorator_par(name):
    def decorator(fun):
        @functools.wraps(fun)
        def wrapper(*args, **kwargs):
            print("Method {} is running".format(name))
            return fun()
        return wrapper
    return decorator
 
@decorator_par("A")
def A():
    print("I am A")
 
@decorator_par("B")
def B():
    print("I am B")
 
A()
B()

執行輸出為:

Method A is running
I am A
Method B is running
I am B

可以看到我們在不改變方法調用代碼的情況下,實現了在該方法之前打印特定的信息。

感謝你能夠認真閱讀完這篇文章,希望小編分享python中裝飾器是什么內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鸡泽县| 巴马| 怀宁县| 玛曲县| 台山市| 阜阳市| 海口市| 潍坊市| 新竹市| 滨州市| 建水县| 满城县| 大余县| 拉孜县| 湟源县| 隆尧县| 东港市| 临沂市| 玉山县| 龙泉市| 鄱阳县| 大安市| 宁明县| 永定县| 海宁市| 林西县| 遂宁市| 宁津县| 交口县| 渭源县| 仙桃市| 奈曼旗| 镇安县| 建阳市| 湟中县| 金坛市| 景洪市| 新巴尔虎左旗| 麻江县| 辽阳县| 修水县|