摘要:的裝飾器是用來裝飾函數的。簡單裝飾器裝飾器的語法糖是使用符號表示,裝飾器本身也是一個函數,只不過參數是函數而已。保留函數的元信息被修飾之后的函數,它的元信息都消失,被替換的函數代替。中提供了來保存函數的元信息。
python的裝飾器是用來裝飾函數的。這是什么意思呢?假如我們有一個函數,這個函數的功能不能滿足我們現有的需求,那么我們可以通過裝飾器在這個函數執行前執行后做一些我們需要的操作(如果函數本身功能不滿足,那就直接修改方法體了,不需要裝飾器幫忙)。
1. 簡單裝飾器裝飾器的語法糖是使用@符號表示,裝飾器本身也是一個函數,只不過參數是函數而已。
def decor_function(func): def wrapper_function(): print("[%s] %s() called" % (ctime(), func.__name__)) return func() return wrapper_function @decor_function def my_func(): print("Hello world") ... my_func()
decor_function也就是我們的裝飾器函數,它對原有的函數進行包裝,返回一個包裝過的函數wrapper_function。使用@修飾過的函數my_func,返回的函數實際上是裝飾器返回的函數wrapper_function.
[Mon Jul 9 17:07:40 2018] my_func() called Hello world2. 修飾含有參數的函數
函數定義可以使用任意的參數,那么裝飾器函數如何處理呢?其實很簡單,使用*args和**kargs就可以方便的調用了,只需要在裝飾器函數的返回的函數中將參數傳遞給被修飾的函數就可以了。
def decor_function(func): def wrapper_function(*args, **kargs): print("[%s] %s() called" % (ctime(), func.__name__)) return func(*args, **kargs) return wrapper_function @decor_function def my_func_with_param(name): print("Hello", name) my_func_with_param("Joe")
[Mon Jul 9 17:12:58 2018] my_func_with_param() called Hello Joe3. 裝飾函數帶參數
裝飾器函數本身也是可以帶參數的,使用參數,可以根據具體的場景添加不同的功能實現。
def decor_function_with_parm(level): if level == "info": logging.info("info message logged") elif level == "error": logging.error("error message logged") else: logging.debug("debug message logged") def wrapper_outter_func(func): def wrapper_inner_func(*args, **kargs): func(*args, **kargs) return wrapper_inner_func return wrapper_outter_func @decor_function_with_parm(level="info") def my_func2(name): print("Hello,", name) my_func2("Joe")
帶參數的裝飾器函數寫起來比較麻煩,因為需要處理的參數比較多,一般最外層的函數處理裝飾器參數,接下來的函數處理func,最后一層函數用來處理被修飾的函數的參數。
4. 多重修飾一個函數可以被多個裝飾器修飾,like this
@decor_function_with_parm(level="info") @decor_function def my_func(): print("Hello world")
執行的順序是:
f = decor_function_with_parm(level="info", decor_function(my_func()))5.使用類來處理
類的__call__()方法可以把類當成函數來處理,所以類也可以用做裝飾器
class Decor: def __init__(self, func): print("__init__ method called") self.func = func def __call__(self, *args, **kargs): print("__call__ method called") self.func(*args, **kargs) @Decor def func(name): print("func called") print("Hello,",name) func("joe")
使用類做裝飾器時,init函數中添加被修飾函數的引用,在call函數中處理參數。
__init__ method called __call__ method called func called Hello, joe6.保留函數的元信息
被修飾之后的函數,它的元信息都消失,被替換的wrapper函數代替。python中提供了functools.wraps來保存函數的元信息。wraps本身也是個裝飾器
def decor_function(func): @wraps(func) def wrapper_function(*args, **kargs): print("[%s] %s() called" % (ctime(), func.__name__)) print(func.__name__) return func(*args, **kargs) return wrapper_function @decor_function def my_func_with_param(name): print("Hello", name) my_func_with_param("joe") print(my_func_with_param.__name__)
[Mon Jul 9 18:16:11 2018] my_func_with_param() called my_func_with_param Hello joe my_func_with_param
參考:理解 Python 裝飾器看這一篇就夠了
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41968.html
摘要:變量查找規則在中一個變量的查找順序是局部環境,閉包,全局,內建閉包引用了自由變量的函數。閉包的作用閉包的最大特點是可以將父函數的變量與內部函數綁定,并返回綁定變量后的函數,此時即便生成閉包的環境父函數已經釋放,閉包仍然存在。 導語:本文章記錄了本人在學習Python基礎之函數篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、掌握裝飾器的本質、功...
摘要:初步認識裝飾器函數裝飾器用于在源代碼中標記函數,以某種方式增強函數的行為。函數裝飾器在導入模塊時立即執行,而被裝飾的函數只在明確調用時運行。只有涉及嵌套函數時才有閉包問題。如果想保留函數原本的屬性,可以使用標準庫中的裝飾器。 《流暢的Python》筆記本篇將從最簡單的裝飾器開始,逐漸深入到閉包的概念,然后實現參數化裝飾器,最后介紹標準庫中常用的裝飾器。 1. 初步認識裝飾器 函數裝飾...
摘要:一般情況下,我們使用裝飾器提供的語法糖,來簡化上面的寫法像上面的情況,可以動態修改函數或類功能的函數就是裝飾器。本文標題為會打扮的裝飾器本文鏈接為參考資料修飾器的函數式編程中的裝飾器介紹思誠之道裝飾器入門與提高賴明星 裝飾器 我們知道,在 Python 中,我們可以像使用變量一樣使用函數: 函數可以被賦值給其他變量 函數可以被刪除 可以在函數里面再定義函數 函數可以作為參數傳遞給另外...
摘要:我們以測量函數運行時間為例來講一講裝飾器的運行原理。三更加通用的裝飾器前面兩部分講了裝飾器的原理,這一部分就講講要寫出一個通用的裝飾器需要注意的問題。首先就是參數的問題,裝飾器返回的函數不是原來的函數,函數的簽名也就和原來的函數簽名不一樣。 一、最簡單的裝飾器 裝飾器是python中很基礎也很實用的一個特性。通過裝飾器我們可以很方便地為一些函數添加相同的功能。我們以測量函數運行時間為例...
閱讀 2048·2019-08-30 15:52
閱讀 2440·2019-08-29 18:37
閱讀 790·2019-08-29 12:33
閱讀 2839·2019-08-29 11:04
閱讀 1523·2019-08-27 10:57
閱讀 2092·2019-08-26 13:38
閱讀 2759·2019-08-26 12:25
閱讀 2445·2019-08-26 12:23