装饰器(decorator)简介

装饰器本质上是一个 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

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值