装饰器
python装饰器的作用是用来拓展函数功能的一种函数,特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是我们不用修改原函数的代码就可以给函数增加新的功能,装饰器有很多种,有函数的装饰器,也有类的装饰器。装饰器的语法是将@装饰器名,放在被装饰对象上面。
Python程序的执行顺序是从上往下顺序执行的,而且碰到函数的定义代码块是不会立即执行的,函数代码块只会被读取到内存中,只有等到该函数被调用时,才会执行其内部的代码块。
函数的调用方式:
1、函数名加括号被当做参数:其实就是先调用函数,再将它的返回值当做别的函数的参数,例如outer(foo())
2、返回函数名加括号:return inner(),其实就是先执行inner函数,再将其返回值作为别的函数的返回值
3、函数名当参数传递给另一个函数,outer(foo),表示传递foo的函数体,而不是执行foo之后的返回值
写代码要遵循开放封闭原则,简单来说,已经实现的功能代码内部不允许被修改,但外部可以被扩展。
装饰器函数
def outer(func):
def inner():
print("认证成功!")
result = func()
print("日志添加成功")
return result
return inner
@outer
def f1():
print("业务部门1数据接口......")
f1()
>>>
认证成功!
业务部门1数据接口......
日志添加成功
函数执行过程:
1、程序开始运行,从上往下解释,读到def outer(func):的时候,发现这是个“一等公民”函数,于是把函数体加载到内存里,
2、读到@outer的时候,程序被@这个语法糖吸引住了,知道这是个装饰器,按规矩要立即执行的,于是程序开始运行@后面那个名字outer所定义的函数。
3、程序返回到outer函数,开始执行装饰器的语法规则。规则是:被装饰的函数的名字会被当作参数传递给装饰函数。装饰函数执行它自己内部的代码后,会将它的返回值赋值给被装饰的函数。原来的f1函数被当做参数传递给了func,而f1这个函数名之后会指向inner函数。
函数也是一个对象,可以把函数function赋值给一个变量,msg = function,当调用msg的时候,就相当调用函数function()
- 闭包
1、一个外部函数里定义一个内部函数;2、内部函数引用外部函数的临时变量;3、外部函数返回值是内部函数的引用(外部函数的返回值是函数对象本身)
1、inner()函数定义在outr()函数里面,2、inner()函数内部引用了外部函数的变量a,且a不是全局变量,3、内部函数的引用inner被当作外部函数的返回值 return inner
python装饰器的作用是用来拓展函数功能的一种函数,特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是我们不用修改原函数的代码就可以给函数增加新的功能;
多个装饰器的执行顺序是 “从最后一个装饰器开始执行,直到执行到第一个装饰器(从下到上执行)";
python装饰器,常用于有切面需求的场景,比如:插入日志、性能监控、权限校验等场景,通过@装饰器之后我们可以先处理日志、日志处理完成之后在执行业务代码;
python 装饰器---不带参数
@ 称之为语法糖,geeter = my_decepertor(geeter) 相当于 @decepertor
python 装饰器---带参数的装饰器
单参数表示被装饰函数需要传入形参
python 装饰器,带自定义参数的装饰器
带自定义参数的装饰器可以用来记录装饰器内部函数被执行的次数
此时geeter()函数的元信息__name__被装饰器函数取代了,geeter.__name__ = wrapper ,为了解决这个问题,使用内置装饰器
@functools.wraps(func),将原函数func的元信息拷贝到内置装饰器函数里面
装饰器嵌套