Python——裝飾器

1、@函數裝飾器

裝飾器可用於修飾其餘函數,例如@classmethod、@staticmethod都是函數裝飾器,他們都是Python內置的函數。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'>

上面的例子能夠看出,當程序使用「@函數」裝飾另外一個函數時,至關於將被修飾的函數做爲參數傳給@符號引用的函數,被裝飾的函數被替換成@符號引用的函數的返回值。blog

 

由於被裝飾函數老是被替換成@符號引用的函數的返回值,那麼咱們想把被裝飾函數在替換以後仍是函數,就能夠把@符號引用的函數返回值變成函數,另外若是被裝飾函數有參數,能夠使用*args和**kwargs。(*args:把參數打包成元組給函數體調用,**kwargs:把關鍵字參數打包成字典給函數體調用)開發

例:io

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'}
'''
相關文章
相關標籤/搜索