装饰器
装饰器的底层实际就是闭包
**在一个外函数中定义了一个内函数, #函数的嵌套**、
**内函数里运用了外函数的临时变量, #嵌套作用域变量**
**并且外函数的返回值是内函数的引用。 #返回函数**
**这样就构成了一个闭包。**`
装饰器是在函数调用之上的修饰 他的作用是在不改变原有项目代码的基础上增加一些额外的功能
装饰器能有助于检查某个人是否被授权去使用一个web应用的端点(endpoint)。它们被大量使用于Flask和Django web框架中。
日志是装饰器运用的另一个亮点
装饰器格式
def outer(func):
def inner(): #自上而下的执行
print('特殊校验功能')
func() #现在代表ff
print('789')
return inner
@outer
def ff():
print('hello python')
ff()
有形参的装饰器
def outer(func):
# @里有形参 这里必须跟
def inner(a,b): #自上而下的执行
print('装饰器函数开始执行')
print('特殊校验功能开始执行')
# 这里也得跟形参
func(a,b) #现在代表ff
print('装饰器函数结束执行')
return inner
@outer
def ff(a,b): #有形参
print('a+b=',(a+b))
ff(50,60)
有形参的装饰器 用不定长参数
def outer(func):
# @里有形参 这里必须跟
def inner(*args,**kwargs): #自上而下的执行
print('装饰器函数开始执行')
print('特殊校验功能开始执行')
# 这里也得跟形参
func(*args,**kwargs) #现在代表ff
print('装饰器函数结束执行')
return inner
@outer
def ff(a,b,d): #有形参
print('a+b+d=',(a+b+d))
ff(50,60,89)
多层装饰器
多层嵌套装饰器开始的时候,
装饰器自上而下开始,
然后执行函数操作,
结束时,装饰器自下而上结束
def outer1(func):
# @里有形参 这里必须跟
def inner(*args, **kwargs): # 自上而下的执行
print('装饰器函数1开始执行')
print('特殊校验功能1开始执行')
# 这里也得跟形参
func(*args, **kwargs) # 现在代表ff
print('装饰器函数1结束执行')
return inner
def outer2(func):
# @里有形参 这里必须跟
def inner(*args, **kwargs): # 自上而下的执行
print('装饰器函数2开始执行')
print('特殊校验功能2开始执行')
# 这里也得跟形参
func(*args, **kwargs) # 现在代表ff
print('装饰器函数2结束执行')
return inner
@outer1
@outer2
def ff(a, b, d): # 有形参
print('a+b+d=', (a + b + d))
ff(50, 60, 89)