一、什麼是python裝飾器(Decorators)
定義:python的裝飾器:裝飾原有的函數,用於拓展原來函數功能的一種函數,在不更改原來函數代碼的基礎上,增加函數的功能。
格式:@ 符號就是裝飾器的語法糖,它放在函數開始定義的地方,這樣就可以省略最後一步再次賦值的操作。
二 、裝飾器返回值及用處
裝飾器的返回值也是一個函數/類對象。它經常用於有切面需求的場景,比如:插入日誌、性能測試、事務處理、緩存、權限校驗等場景,裝飾器是解決這類問題的絕佳設計。
裝飾器的具體詳解可學習此鏈接
三、用法:
1、函數裝飾器
用@函數名,裝飾器可以嵌套函數,分爲裝飾器帶參數和不帶參數的。用法可參照以下代碼使用。
代碼引用自:
def demo1(demo_name):
def wrapper(fun):
print(demo_name, "wrapper")
fun()
# end def
@wrapper
def test():
print(demo_name, "test")
# end def
test # 調用test方法,此處不能加()。
# end def(demo)
def demo2(demo_name): #可以創建嵌套的函數,函數也能返回函數
def wrapper(func):
def callback(*args, **kwargs):
print(demo_name, "callback")
return func(*args, **kwargs)
return callback
# end def
@wrapper
def test(item):
print(demo_name, "test", item)
# end def
test("Hello") # 調用test方法
# end def(demo)
def demo3(demo_name):
def decorate(tip):
def wrapper(func):
def callback(*args, **kwargs):
print(demo_name, tip)
return func(*args, **kwargs)
return callback
return wrapper
# end def(decorate)
@decorate("Something") # 帶參數的裝飾器
def test(item):
print(demo_name, "test", item)
# end def
test("Hello") # 調用test方法
# end def(demo)
if __name__ == '__main__':
demo1("demo1")
print()
# 被裝飾函數傳參
demo2("demo2")
print()
# 裝飾器傳參
demo3("demo3")
print()
2、類裝飾器:
class Foo(object):
def __init__(self, func):
self._func = func
def __call__(self):
print ('class decorator runing')
self._func()
print ('class decorator ending')
@Foo
def bar():
print ('bar')
bar()
functools.wraps
四、裝飾器的執行順序:
一個函數還可以同時定義多個裝飾器,從內向外的調用,執行順序是從裏到外,最先調用最裏層的裝飾器,最後調用最外層的裝飾器
@a
@b
@c
def f ():
pass
等價於:
f = a(b(c(f)))