装饰器: 为被装饰的对象(函数或类)增加新的功能或者附加限制条件或者帮助输出
def outer(func):#装饰器函数(对真正装饰器进行了封装防止函数还没调用就已经被执行) def inner(): print("认证成功!") result = func()#调用旧函数。 print("日志添加成功") return result return inner#返回的是函数体覆盖f1.(f1 = inner)@outer #装饰器名称def f1():#被装饰的函数 print("业务部门1数据接口......")结果:认证成功!业务部门1数据接口......日志添加成功
注意:
-
装饰器规则是: @装饰器名,放在被装饰对象上面装饰器装饰过程:被装饰的函数的名字会被当作参数传递给装饰函数。装饰函数执行它自己内部的代码后,会将它的返回值赋值给被装饰的函数。1:f1这个函数名(而不是f1()这样被调用后)当做参数传递给装饰函数outer,也就是:func = f1,@outer等于outer(f1),实际上传递了f1的函数体,而不是执行f1后的返回值.2:f1当做参数传递给func这个形参,func这个变量保存了老的函数在内存中的地址,通过它就可以执行老的函数体。3:outer函数return的是inner这个函数名,而不是inner()这样被调用后的返回值.return 返回值是个函数名inner,并且这个函数名会被赋值给f1这个被装饰的函数,也就是f1 = inner(实际上是f1这个函数名更改成指向inner这个函数名指向的函数体内存地址,f1不再指向它原来的函数体的内存地址)4:@outer这句代码在程序执行到这里的时候就会自动执行outer函数内部的代码,如果不封装一下,在业务部门还未进行调用的时候,就执行了,这和初衷不符。如:
-
def outer(func): print("认证成功!") result = func() print("日志添加成功") return result@outerdef f1(): print("业务部门1数据接口......")# 业务部门并没有调用f1函数------------------------------------------执行结果:认证成功!业务部门1数据接口......日志添加成功