python基礎之裝飾器

裝飾器的功能:在不改變原來函數結構的情況下,改變函數的功能。

裝飾器函數:實際上就是一個閉包。

閉包: 函數內定義一個內函數,外函數return回內函數的引用,內函數使用外部函數的參數。

一、對無參函數裝飾

#---------------------------------裝飾器函數-------------------------------
>>> def outer(func):
	def inner( ):
		print("@@@@@inner@@@@@")
		func( )
	return inner
#---------------------------------需要被裝飾的函數----------------------
>>> def f( ):
	print("@@原函數@@")
#------------------開始裝置,將需要被裝飾的函數func作爲參數傳入到裝飾器函數outer中------------
>>> t=outer(f)         # t可以換成被裝飾的函數名,即f=outer(f)
#---------------------------------裝飾完畢,調用-----------------------------
>>> t()                #f()
@@@@@inner@@@@@
@@原函數@@

 將以上代碼換爲@形式:

>>> def outer(func):
	def inner( ):
		print("@@@@@inner@@@@@")
		func( )
	return inner
>>> @outer
    def f( ):
	print("@@原函數@@")	
>>> f()

@@@@@inner@@@@@
@@原函數@@

二、對有參函數裝飾

>>> def outer(func):
	def inner(x,y):
		print("@@@@@inner@@@@@")
		func(x,y)
	return inner
>>> @outer
    def f(a,b):
	    print("a=%s,b=%s" %(a,b))	
>>> f(2,3)

@@@@@inner@@@@@
a=2,b=3

三、對有返回值函數裝飾

>>> def outer(func):
	def inner(a,b):
		print("@@@@@inner@@@@@")
		x=func(a,b)
		return x  
	return inner    
>>> @outer
    def f(a,b):
	    print("a=%s,b=%s" %(a,b))
	    return "ok,finished"
>>> x=f(2,3)  
    
@@@@@inner@@@@@
a=2,b=3
>>> x       
'ok,finished'

四、通用裝飾器:有參、無參,有返回、無返回

>>> def outer(func):
	    def inner(*args,**kwargs):      #參數的寫法,被裝飾函數有多少參數都可以
		    print("@@@@@inner@@@@@")
		    x=func(*args,**kwargs)      #參數的寫法,被裝飾函數有多少參數都可以
		    return x                    #此處寫入返回,被裝飾函數有沒有返回都可以
	    return inner

>>> @outer
def f(a,b):
	print("a=%s,b=%s" %(a,b))
	return "ok,finished"

>>> x=f(2,3)
@@@@@inner@@@@@
a=2,b=3
>>> x
'ok,finished'

​

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章