闭包装饰

闭包:
1.函数内嵌套函数
2.内部函数引用外部函数的局部变量
3.外部函数的返回值是内部函数
闭包的缺点:
由于内部函数引用了外部函数的局部变量,导致外部函数执行完之后,局部变量没有及时释放,占用内存
装饰器的作用:
在不更改原始函数的基础上,为函数添加一些额外功能

不带参数

def run_time(func):
    def test():
        start = datetime.now()
        func()
        print(datetime.now() - start)
    print(type(test))
    return test
# 下面的装饰器 等同于这句话 eat = run_time(eat)
@run_time
def eat():
    print('吃饭了')
# 把eat函数对象传递到run_time函数中
# 当调用eat()函数时,实际上执行的闭包中的test()函数
eat()

携带参数

def premission(form_role):
    # 函数装饰器的开始
    def role(func):
        def test():
            if 3 > form_role:
                func()
            else:
                print('没有权限')
        return test
    return role
# premission(2) 返回role函数对象
# 相当于写了@role
# 装饰器执行完成之后相当于 sleep = role(sleep)
@premission(5)
def sleep():
    print('睡觉了...')
sleep()

# 下面的写法等同于使用装饰器的写法
# 1.执行premission(2)返回role函数
# role = premission(2)
# 2.执行role返回test函数,并赋值给sleep
# sleep = role(sleep)
# 3.执行sleep()就是执行test()
# sleep()

判断用户是否登录的装饰器

def islogin(func)
    def login_function(request,*args,**kwargs):
        if request.session.get('u_name',None):
            return func(request,*args,**kwargs)
        else:
            response=HttpResponseRedirect(settings.LOGIN_URL)
            response.set_cookie('next_url',response.get_full_path())
            return response
    return login_function


@islogin
def center(request):
    return render(request,'center.html')
闭包装饰器是一种特殊的装饰器,它使用闭包的概念来实现。闭包是指一个函数可以访问并操作其外部函数中定义的变量。在Python中,闭包装饰器可以用于给函数添加额外的功能,同时保持函数的原始定义不变。 引用中的示例展示了装饰器传参的形式。在这个例子中,outer函数是一个装饰器,它将inner函数作为子函数返回,并在inner函数中添加了额外的功能。通过使用@outer装饰器语法,我们可以在add函数上应用outer装饰器,从而在调用add函数时执行装饰器中的代码。 引用中的示例展示了多层装饰器的使用。在这个例子中,outer1和outer2函数分别是两个装饰器,他们都返回一个inner函数。通过使用@outer1和@outer2装饰器语法,我们可以在outers函数上应用这两个装饰器,并在调用outers函数时按照装饰器的定义顺序执行相关的代码。 引用提供了关于Python闭包装饰器的使用方法的总结。这篇文章通过示例代码详细介绍了闭包装饰器的使用,对于学习和工作有一定的参考价值。 引用中的示例展示了装饰器的形式。在这个例子中,outer函数是一个装饰器,它将inner函数作为子函数返回,并在inner函数中添加了额外的功能。通过使用@outer装饰器语法,我们可以在add函数上应用outer装饰器,从而在调用add函数时执行装饰器中的代码。 综上所述,Python闭包装饰器是一种利用闭包概念实现的特殊装饰器,可以用于给函数添加额外的功能。这种装饰器可以通过装饰器传参的形式、多层装饰器的形式或普通的装饰器形式来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值