装饰器
装饰器(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数据接口...... 日志添加成功
参考:
python 装饰器 - 刘江的python教程 (liujiangblog.com)
理解 Python 装饰器看这一篇就够了 - FooFish
Python(12):Python函数高级(命名空间、作用域、装饰器) - springsnow - 博客园 (cnblogs.com)

浙公网安备 33010602011771号