装饰器(Decorator)的作用是可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出。
装饰器有很多种,有函数的装饰器,也有类的装饰器。
体现设计模式中的装饰模式,强调开放封闭原则(已经实现的功能代码内部不允许被修改,但外部可以被扩展)
最基本的结构:
def outer(func): def inner(): print('认证成功') result = func() print('日志添加成功') return result return inner @outer def f1(): print('业务部门1数据接口……')
如上述代码中所示,程序读到@outer时会执行以下步骤:1、将被装饰的函数的名字作为参数传递给装饰器函数;2、装饰器执行其函数内的代码,将返回值赋给被装饰的函数(被装饰的函数名指向新的返回对象)
装饰器内为啥有时会封装一层函数:因为@outer这句代码在程序执行到这里的时候会自动执行outer函数内部的代码,如果不封装就会直接执行,可能会与初衷不符。
被装饰函数的有入参,该如何传递?
样例代码:
def outer(func): def inner(username): print("认证成功!") result = func(username) print("日志添加成功") return result return inner @outer def f1(name): print("%s 正在连接业务部门1数据接口......"%name) # 调用方法 f1("jack")
另外注意事项:
1、一个函数可以被多个装饰器装饰。
2、装饰器也可以有自己的参数,样例代码:
# 认证函数 def auth(request,kargs): print("认证成功!") # 日志函数 def log(request,kargs): print("日志添加成功") # 装饰器函数。接收两个参数,这两个参数应该是某个函数的名字。 def Filter(auth_func,log_func): # 第一层封装,f1函数实际上被传递给了main_fuc这个参数 def outer(main_func): # 第二层封装,auth和log函数的参数值被传递到了这里 def wrapper(request,kargs): # 下面代码的判断逻辑不重要,重要的是参数的引用和返回值 before_result = auth_func(request,kargs) if(before_result != None): return before_result main_result = main_func(request,kargs) if(main_result != None): return main_result after_result = log_func(request,kargs) if(after_result != None): return after_result return wrapper return outer # 注意了,这里的装饰器函数有参数哦,它的意思是先执行filter函数 # 然后将filter函数的返回值作为装饰器函数的名字返回到这里,所以, # 其实这里,Filter(auth,log) = outer , @Filter(auth,log) = @outer @Filter(auth,log) def f1(name,age): print("%s 正在连接业务部门1数据接口......"%name) # 调用方法 f1("jack",18)
# 运行结果
# 认证成功!
# jack
# 正在连接业务部门1数据接口...... 日志添加成功
标签:outer,函数,result,func,装饰,def From: https://www.cnblogs.com/freecheng/p/17400536.html