在不改变调用方式,不改变原有函数内部代码的基础上,为多个函数在执行之前或之后做相同的操作。
前提:必须理解闭包,和闭包的格式以后,才能更好的理解装饰器。
#===============基本构造==============
def 外层函数(参数):
def 内层函数(*args,**kwargs):
retrun 参数(*args,**kwargs)
return 内层函数
#===============实例==================
def a(func):
def b(*args,**kwargs):
return func(*args,**kwargs)
return b
@a
def func():
pass
func()
@的作用:
1. 执行a函数,并将func函数当做参数传递到a中。
2. a的返回值重新赋值给下面的函数。
@a
相当于:
func = a(func)
func()
带参数的装饰器:
#==================基础版本===================
def wrapper(func):
def innre(*args,**kwargs):
value = func(*args,**kwargs)
return value
return innre
@wrapper
def a():
print(123)
a()
#==================带参数的装饰器===================
def wrapper(value):
print(value)
def inner(func):
print('678')
def function(*args,**kwargs):
f = func(*args,**kwargs)
return f
return function
return inner
@wrapper('456')
def a():
print('123')
就是在原有的装饰器上再加一层函数,目的是可以传该函数单独使用的参数而设计。
在没有执行a()的时候,带参数的装饰器也会运行到function函数。