聊聊Python装饰器
生活随笔
收集整理的這篇文章主要介紹了
聊聊Python装饰器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【相關學習推薦:python教程】
裝飾器本質是一個接受參數為函數的函數。作用:為一個已經實現的方法添加額外的通用功能,比如日志記錄、運行計時等。舉例不帶參數的裝飾器,不用@
# 不帶參數的裝飾器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 function 1 2 3 after function
個人理解:
相當于在 do_something 函數外面套了兩個輸出:before function 和 after function。
不帶參數的裝飾器,用 @
# 不帶參數的裝飾器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 function 1 2 3 after function
個人理解:
相當于執行 do_something 函數的時候,因為有 @ 的原因,已經知道有一層裝飾器 deco_test,所以不需要再單獨寫 deco_test(do_something) 了。
帶參數的裝飾器
# 帶參數的裝飾器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() 1 2 3 after function: [debug]: enter function do_something()
個人理解:
裝飾器帶了一個參數 level = "debug"。
最外層的函數 logging() 接受參數并將它們作用在內部的裝飾器函數上面。內層的函數 wrapper() 接受一個函數作為參數,然后在函數上面放置一個裝飾器。這里的關鍵點是裝飾器是可以使用傳遞給 logging() 的參數的。
類裝飾器
# 類裝飾器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 function 1 2 3 class decorator after function
個人理解:
使用一個裝飾器去包裝函數,返回一個可調用的實例。 因此定義了一個類裝飾器。
兩層裝飾器
# 不帶參數的裝飾器def deco_test(func):
def wrapper(*args, **kwargs):
print("before function")
f = func(*args, **kwargs)
print("after function")
return f return wrapper# 帶參數的裝飾器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 function 1 2 3 after function after function: [debug]: enter function wrapper()
個人理解:
在函數 do_something() 外面先套一層 deco_test() 裝飾器,再在最外面套一層 logging() 裝飾器。
想了解更多編程學習,敬請關注php培訓欄目!
總結
以上是生活随笔為你收集整理的聊聊Python装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 休闲食品营收利润双增长,线上市场如何打通
- 下一篇: 2023世界人工智能大会7月6日-8日举