1. python裝飾器html
https://foofish.net/python-decorator.htmlpython
歸納來講,裝飾器的做用就是爲已經存在的對象(類或函數)添加額外的功能。編程
能夠使用以下的方式:(簡單的裝飾器)app
def use_logging(func): def wrapper(): logging.warn("%s is running" % func.__name__) return func() # 把 foo 當作參數傳遞進來時,執行func()就至關於執行foo() return wrapper def foo(): print('i am foo') foo = use_logging(foo) # 由於裝飾器 use_logging(foo) 返回的時函數對象 wrapper,這條語句至關於 foo = wrapper foo()
解釋: use_logging 就是一個裝飾器,它一個普通的函數,它把執行真正業務邏輯的函數 func 包裹在其中,看起來像 foo 被 use_logging 裝飾了同樣,use_logging 返回的也是一個函數,這個函數的名字叫 wrapper。在這個例子中,函數進入和退出時 ,被稱爲一個橫切面,這種編程方式被稱爲面向切面的編程。函數
使用python裝飾器的語法糖(@ 符號就是裝飾器的語法糖,它放在函數開始定義的地方)能夠省略最後一步「賦值」的操做:spa
def use_logging(func): def wrapper(): logging.warn("%s is running" % func.__name__) return func() return wrapper @use_logging def foo(): print("i am foo") foo()
注:裝飾器在 Python 使用如此方便都要歸因於 Python 的函數能像普通的對象同樣能做爲參數傳遞給其餘函數,能夠被賦值給其餘變量,能夠做爲返回值,能夠被定義在另一個函數內。.net
還有帶參數的裝飾器、類裝飾器等等,詳見上面推薦的博客。code