裝飾器的功能:在不改變原來函數結構的情況下,改變函數的功能。
裝飾器函數:實際上就是一個閉包。
閉包: 函數內定義一個內函數,外函數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'