一、@函數裝飾器 裝飾器可用於修飾其他函數,例如@classmethod、@staticmethod都是函數裝飾器,他們都是Python內置的函數。 我們可以自己開發自定義函數裝飾器,例: 上面的例子可以看出,當程式使用“@函數”裝飾另一個函數時,相當於將被修飾的函數作為參數傳給@符號引用的函數,被 ...
一、@函數裝飾器
裝飾器可用於修飾其他函數,例如@classmethod、@staticmethod都是函數裝飾器,他們都是Python內置的函數。
我們可以自己開發自定義函數裝飾器,例:
def a(f): print ('0') f() print ('2') return 666 ''' @a 函數裝飾器相當於a(b), 把b()函數作為參數傳給a(), b()函數返回a()的返回值 ''' @a def b(): print ('1') ''' 列印 0 1 2 ''' print (b) # 返回a()的返回值,列印 666 print (type(b)) # b不再是函數,而是被替換成666,所以類型為int,列印 <class 'int'>
上面的例子可以看出,當程式使用“@函數”裝飾另一個函數時,相當於將被修飾的函數作為參數傳給@符號引用的函數,被裝飾的函數被替換成@符號引用的函數的返回值。
因為被裝飾函數總是被替換成@符號引用的函數的返回值,那麼我們想把被裝飾函數在替換之後還是函數,就可以把@符號引用的函數返回值變成函數,另外如果被裝飾函數有參數,可以使用*args和**kwargs。(*args:把參數打包成元組給函數體調用,**kwargs:把關鍵字參數打包成字典給函數體調用)
例:
def d(f): # 定義a()嵌套函數 def a(*args,**kwargs): print ('取元組第一個元素:',args[0]) return f(args,kwargs) return a @d def b(k1,k2): print ('元組:',k1) print ('字典:',k2) print (b) b('1','2',k2 = '777') ''' 最終還是會被替換成a()函數, 調用b()實際上是在調用a()函數, 列印 <function d.<locals>.a at 0x0000000003169268> 取元組第一個元素: 1 元組: ('1', '2') 字典: {'k2': '777'} '''