您好,登錄后才能下訂單哦!
這篇文章主要介紹了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中裝飾器是什么內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。