国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術文章
文章詳情頁

一些關于python 裝飾器的個人理解

瀏覽:28日期:2022-07-12 17:28:47

裝飾器

本質是一個接受參數(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 裝飾器的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 翁源县| 海晏县| 康乐县| 都匀市| 南华县| 磴口县| 湄潭县| 绥芬河市| 高陵县| 邯郸县| 濮阳县| 福建省| 大足县| 盐亭县| 宜春市| 依安县| 二连浩特市| 彩票| 中江县| 东乡族自治县| 保定市| 邛崃市| 天祝| 沙河市| 夏邑县| 泸西县| 富宁县| 剑阁县| 临桂县| 泸定县| 乐安县| 连江县| 鄂托克旗| 阳曲县| 唐山市| 布拖县| 哈密市| 芦山县| 贞丰县| 镇沅| 永康市|