装饰器的功能:在不改变原来函数结构的情况下,改变函数的功能。
装饰器函数:实际上就是一个闭包。
闭包: 函数内定义一个内函数,外函数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'