装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码到装饰器中并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。这种编程方式被称为面向切面的编程
def set_func(func):
print("==1==")
def call_func():
print("--->1")
return "<h1>" + func() + "</h1>"
return call_func
def set_func2(func):
print("==2==")
def call_func():
print("-----2----")
return "<body>" + func() + "</body>"
return call_func
# 执行
@set_func2
@set_func
def test(*args, **kwargs):
return "哈哈"
a = test()
print(a)
# 带参数的装饰器
def parm_func(num):
def set_func(func):
print("==2==")
def call_func():
if num == 1:
print("体检1")
elif num == 2:
print("体检2")
else:
pass
return func()
return call_func
return set_func
@parm_func(2) # 把参数传给装饰器 用这个装饰器的返回值给下面的函数装饰
def test(*args, **kwargs):
return "哈哈"
a = test()
print(a)
# 一个函数定义多个装饰器
def func2():
pass
def func1():
pass
def func():
pass
@func2
@func1
@func
def f():
pass
它的执行顺序是从里到外,最先调用最里层的装饰器,最后调用最外层的装饰器,等效于f = func2(func1(func(f)))
创建后台装饰器,事例:
# 登录装饰器
def login_required(func):
@wraps(func)
def wrapper(*args, **kwargs):
uid = request.cookies.get('uid')
if uid is None or not MySession.reactive(uid):
return redirect('/')
return func(*args, **kwargs)
return wrapper
# 后台管理中使用装饰器
@admin.route('/admin/login', methods=['POST'])
@login_required
def admin_login():
pass
return ok