• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

python 多个装饰器的调用顺序

python 搞代码 4年前 (2022-01-09) 10次浏览 已收录 0个评论
文章目录[隐藏]

前言

装饰器是程序开发中经常会用到的一个功能,也是python语言开发的基础知识,如果能够在程序中合理的使用装饰器,不仅可以提高开发效率,而且可以让写的代码看上去显的高大上^_^

使用场景

可以用到装饰器的地方有很多,简单的举例如以下场景

  • 引入日志

  • 函数执行时间统计

  • 执行函数前预备处理

  • 执行函数后清理功能

  • 权限校验等场景

  • 缓存

装饰器案例

def user_login(fun):    def islogin(request,*args,**kwargs):        context = {}        if request.session.has_key('uname'):            context['uname'] = request.session.get('uname')        else:            context['uname'] = 'None'        return fun(request,context,*args,**kwargs)    return islogin

@user_logindef ucOrder(request,context,pIndex):    '''    获取数据    处理数据    传递到页面上去

以上是一个简单电商应用中使用装饰器的案例,其中 ucOrder函数是是用户需要登录后才能被执行到的。如果不使用装饰器的话,普通的做法可能是在 ucOrder中写一堆校验代码来判断用户是否登录,然后决定后面的执行逻辑,这样比较麻烦。

那么使用装饰器之后就比较简单了,只需要按照装饰器的使用格式,在ucOrder函数上面加上@user_login,那么python解释器在运行的时候,就会从上到下解释代码,先执行user_login函数,并且将ucOrder作为user_login函数的参数传入进去,即等价于user_login(ucOrder),这样就起到了一个校验用户是否登录,从而决定是否执行ucOrder函数的功能

多个装饰器使用的调用顺序

def one(func):    print('----1----')    def two():        print('----2----')        func()    return twodef a(func):    print('----a----')    def b():        print('----b----')        func(<div style="color:transparent">本文来源gaodai.ma#com搞##代!^码网(</div>)    return b@one@adef demo():    print('----3----')demo()

执行结果:

/usr/bin/python2.7 /home/python/Desktop/tornadoProject/one.py----a--------1--------2--------b--------3----

可以从执行结果中看到,如果是使用多个装饰器,它的执行顺序还是有点怪异的的,为什么会这样呢?

关于这个问题,有更好的文章可以解释,Python 装饰器执行顺序迷思

更多python 多个装饰器的调用顺序相关文章请关注搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:python 多个装饰器的调用顺序

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址