您好,登錄后才能下訂單哦!
本篇內容介紹了“python裝飾器有什么作用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
要想了解裝飾器,首先要了解一個概念,閉包。什么是閉包,一句話說就是,在函數中再嵌套一個函數,并且引用外部函數的變量,這就是一個閉包了。光說沒有概念,直接上一個例子。
def outer(x): def inner(y): return x + y return inner print(outer(6)(5)) ----------------------------- >>>11
如代碼所示,在outer函數內,又定義了一個inner函數,并且inner函數又引用了外部函數outer的變量x,這就是一個閉包了。在輸出時,outer(6)(5),第一個括號傳進去的值返回inner函數,其實就是返回6 + y,所以再傳第二個參數進去,就可以得到返回值,6 + 5。
接下來就講裝飾器,其實裝飾器就是一個閉包,裝飾器是閉包的一種應用。什么是裝飾器呢,簡言之,python裝飾器就是用于拓展原來函數功能的一種函數,這個函數的特殊之處在于它的返回值也是一個函數,使用python裝飾器的好處就是在不用更改原函數的代碼前提下給函數增加新的功能。使用時,再需要的函數前加上@demo即可。
def debug(func): def wrapper(): print("[DEBUG]: enter {}()".format(func.__name__)) return func() return wrapper @debug def hello(): print("hello") hello() ----------------------------- >>>[DEBUG]: enter hello() >>>hello
例子中的裝飾器給函數加上一個進入函數的debug模式,不用修改原函數代碼就完成了這個功能,可以說是很方便了。
上面例子中的裝飾器是不是功能太簡單了,那么裝飾器可以加一些參數嗎,當然是可以的,另外裝飾的函數當然也是可以傳參數的。
def logging(level): def outwrapper(func): def wrapper(*args, **kwargs): print("[{0}]: enter {1}()".format(level, func.__name__)) return func(*args, **kwargs) return wrapper return outwrapper @logging(level="INFO") def hello(a, b, c): print(a, b, c) hello("hello,","good","morning") ----------------------------- >>>[INFO]: enter hello() >>>hello, good morning
如上,裝飾器中可以傳入參數,先形成一個完整的裝飾器,然后再來裝飾函數,當然函數如果需要傳入參數也是可以的,用不定長參數符號就可以接收,例子中傳入了三個參數。
裝飾器也不一定只能用函數來寫,也可以使用類裝飾器,用法與函數裝飾器并沒有太大區別,實質是使用了類方法中的__call__魔法方法來實現類的直接調用。
class logging(object): def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print("[DEBUG]: enter {}()".format(self.func.__name__)) return self.func(*args, **kwargs) @logging def hello(a, b, c): print(a, b, c) hello("hello,","good","morning") ----------------------------- >>>[DEBUG]: enter hello() >>>hello, good morning
類裝飾器也是可以帶參數的,如下實現
class logging(object): def __init__(self, level): self.level = level def __call__(self, func): def wrapper(*args, **kwargs): print("[{0}]: enter {1}()".format(self.level, func.__name__)) return func(*args, **kwargs) return wrapper @logging(level="TEST") def hello(a, b, c): print(a, b, c) hello("hello,","good","morning") ----------------------------- >>>[TEST]: enter hello() >>>hello, good morning
好了,如上就是裝飾器的一些概念和大致的用法啦,想更深入的了解裝飾器還是需要自己在平時的練習和應用中多體會
“python裝飾器有什么作用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。