天天看點

python裝飾器帶括号和不帶括号的文法和用法

裝飾器的寫法補充:

通常裝飾器的寫法是@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      

結論: 内嵌之後,可以增加判斷條件,增加了裝飾器的靈活性。