一些關于python 裝飾器的個人理解
裝飾器
本質是一個接受參數(shù)為函數(shù)的函數(shù)。作用:為一個已經實現(xiàn)的方法添加額外的通用功能,比如日志記錄、運行計時等。
舉例
1.不帶參數(shù)的裝飾器,不用@
# 不帶參數(shù)的裝飾器def deco_test(func): def wrapper(*args, **kwargs): print('before function') f = func(*args, **kwargs) print('after function') return f return wrapperdef do_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) return aif __name__ == ’__main__’: # 不用@ f = deco_test(do_something)('1','2','3')
輸出:
before function123after function
個人理解:
相當于在 do_something 函數(shù)外面套了兩個輸出: before function 和 after function 。
2.不帶參數(shù)的裝飾器,用 @
# 不帶參數(shù)的裝飾器def deco_test(func): def wrapper(*args, **kwargs): print('before function') f = func(*args, **kwargs) print('after function') return f return wrapper@deco_testdef do_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) return aif __name__ == ’__main__’: # 使用@ f = do_something('1','2','3')
輸出:
before function123after function
個人理解:
相當于執(zhí)行 do_something 函數(shù)的時候,因為有 @ 的原因,已經知道有一層裝飾器 deco_test ,所以不需要再單獨寫 deco_test(do_something) 了。
3.帶參數(shù)的裝飾器
# 帶參數(shù)的裝飾器def logging(level): def wrapper(func): def inner_wrapper(*args, **kwargs): print('[{level}]: enter function {func}()'.format(level=level, func=func.__name__)) f = func(*args, **kwargs) print('after function: [{level}]: enter function {func}()'.format(level=level, func=func.__name__)) return f return inner_wrapper return wrapper@logging(level='debug')def do_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) return aif __name__ == ’__main__’: # 使用@ f = do_something('1','2','3')
輸出:
[debug]: enter function do_something()123after function: [debug]: enter function do_something()
個人理解:
裝飾器帶了一個參數(shù) level = 'debug' 。
最外層的函數(shù) logging() 接受參數(shù)并將它們作用在內部的裝飾器函數(shù)上面。內層的函數(shù) wrapper() 接受一個函數(shù)作為參數(shù),然后在函數(shù)上面放置一個裝飾器。這里的關鍵點是裝飾器是可以使用傳遞給 logging() 的參數(shù)的。
4.類裝飾器
# 類裝飾器class deco_cls(object): def __init__(self, func): self._func = func def __call__(self, *args, **kwargs): print('class decorator before function') f = self._func(*args, **kwargs) print('class decorator after function') return f@deco_clsdef do_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) return aif __name__ == ’__main__’: # 使用@ f = do_something('1','2','3')
輸出:
class decorator before function123class decorator after function
個人理解:
使用一個裝飾器去包裝函數(shù),返回一個可調用的實例。 因此定義了一個類裝飾器。
5.兩層裝飾器
# 不帶參數(shù)的裝飾器def deco_test(func): def wrapper(*args, **kwargs): print('before function') f = func(*args, **kwargs) print('after function') return f return wrapper# 帶參數(shù)的裝飾器def logging(level): def wrapper(func): def inner_wrapper(*args, **kwargs): print('[{level}]: enter function {func}()'.format(level=level, func=func.__name__)) f = func(*args, **kwargs) print('after function: [{level}]: enter function {func}()'.format(level=level, func=func.__name__)) return f return inner_wrapper return wrapper@logging(level='debug')@deco_testdef do_something(a,b,c): print(a) time.sleep(1) print(b) time.sleep(1) print(c) return aif __name__ == ’__main__’: # 使用@ f = do_something('1','2','3')
輸出:
[debug]: enter function wrapper()before function123after functionafter function: [debug]: enter function wrapper()
個人理解:
在函數(shù) do_something() 外面先套一層 deco_test() 裝飾器,再在最外面套一層 logging() 裝飾器。
以上就是python 裝飾器的一些個人理解的詳細內容,更多關于python 裝飾器的資料請關注好吧啦網其它相關文章!
相關文章:
1. PHP設計模式中工廠模式深入詳解2. asp(vbs)Rs.Open和Conn.Execute的詳解和區(qū)別及&H0001的說明3. Ajax實現(xiàn)表格中信息不刷新頁面進行更新數(shù)據(jù)4. JSP數(shù)據(jù)交互實現(xiàn)過程解析5. ThinkPHP5實現(xiàn)JWT Token認證的過程(親測可用)6. .NET中l(wèi)ambda表達式合并問題及解決方法7. ASP.NET MVC遍歷驗證ModelState的錯誤信息8. 解決AJAX返回狀態(tài)200沒有調用success的問題9. ASP 信息提示函數(shù)并作返回或者轉向10. CSS hack用法案例詳解
