裝飾器的寫法補充:
通常裝飾器的寫法是@func(),而有的時候為了減少出錯率,可能會寫成@func,沒有()括号,這時我們可以這樣定義,來減少括号。下面通過兩個例子還看。
一般裝飾器的寫法:
1 def log(func=None):
2
3 def inner(*args, **kwargs):
4 print('do something before')
5 res = func(*args, **kwargs)
6 print('do something after')
7 return rees
8
9 return inner
10
11 #使用裝飾器
12 @log()
13 def my_func():
14 print('i am my_func')
15
16 #運作這個函數
17 my_func()
運作結果:
1 do something before
2 i am my_func
3 do something after
可以不帶括号的裝飾器寫法
需要增加判斷在函數内,用于判斷使用裝飾器的函數是否可以調用,以達到括号的***寫法
判斷的裝飾器寫法
def log(func=None):
#需要再次嵌套一層裝飾器,才可以供下面運作時使用
def wrapper(fun)
def inner(*args, **kwargs):
print('do something before')
res = fun(*args, **kwargs)
print('do something after')
return rees
return inner
#判斷func(參數):
if func is None:
return wrapper
#如果func是可以調用的函數
elif callable(func):
return wrapper(func)
#使用裝飾器的時候,兩種寫法都可以運作
第一種不帶括号:
@log
def my_func():
print('i am my_func')
第二種帶括号的:
@log()
def my_func():
print('i am my_func')
#運作這個函數
my_func()
不帶括号的了解:
@log =>等同于 my_func = log(my_func)
帶括号的了解:
@log() =>等同于 my_func = log()(my_func)
兩種方式的一樣,運作結果:
1 do something before
2 i am my_func
3 do something after
結論: 内嵌之後,可以增加判斷條件,增加了裝飾器的靈活性。