python 装饰器做缓存

系统 1392 0

使用装python饰器做缓存

装饰器在之前的文章中有讲过,这里主要是说了装饰器的用法和应该怎么理解。这片文章给出一片补充:主要说在缓存方面的应用。

在此之前呢,需要补充一些知识点:就是 python 查找变量的顺序是什么?

            
              答案就是LEGB原则:也就是`Local -> Enclosed -> Global -> Built-in`

            
          

也就是先在局部作用域内(例如函数内)进行查找,然后在[闭包] 1 内查找,接下来分别是全局作用域和内置的保留名称


注意:闭包内的变量,不能改变,但是对于列表类型或是字典类型的话,可以进行修改内部的值。这也是用装饰器作为缓存的关键地方!

代码如下:主要是cache函数, 可以运行起来,然后访问本机8089端口,多次刷新,就会发现变化了!(注意链接后面要加参数x=1)
有什么问题可以在评论区讨论呦,多多交流!

            
              
                # coding=utf8
              
              
                import
              
               tornado

              
                from
              
               tornado
              
                .
              
              web 
              
                import
              
               RequestHandler

              
                from
              
               tornado
              
                .
              
              ioloop 
              
                import
              
               IOLoop

              
                from
              
               functools 
              
                import
              
               wraps



              
                def
              
              
                cache
              
              
                (
              
              func
              
                )
              
              
                :
              
              
    x 
              
                =
              
              
                [
              
              
                0
              
              
                ]
              
              

    @wraps
              
                (
              
              func
              
                )
              
              
                def
              
              
                wrapper
              
              
                (
              
              
                *
              
              args
              
                ,
              
              
                **
              
              kwargs
              
                )
              
              
                :
              
              
                # print args, kwargs
              
              
        self 
              
                =
              
               args
              
                [
              
              
                0
              
              
                ]
              
              
                # x.append(args[0])
              
              
        x
              
                [
              
              
                0
              
              
                ]
              
              
                +=
              
              
                int
              
              
                (
              
              self
              
                .
              
              get_argument
              
                (
              
              
                "x"
              
              
                )
              
              
                )
              
              
                print
              
               x
        
              
                return
              
               func
              
                (
              
              
                *
              
              args
              
                ,
              
              
                **
              
              kwargs
              
                )
              
              
                return
              
               wrapper


              
                class
              
              
                MainHandler
              
              
                (
              
              RequestHandler
              
                )
              
              
                :
              
              

    @cache
    
              
                def
              
              
                get
              
              
                (
              
              self
              
                ,
              
              
                *
              
              args
              
                ,
              
              
                **
              
              kwargs
              
                )
              
              
                :
              
              
                # print "yes"
              
              
                # print self.get_argument("x")
              
              
        self
              
                .
              
              write
              
                (
              
              
                "yes!"
              
              
                )
              
              
                def
              
              
                post
              
              
                (
              
              self
              
                ,
              
              
                *
              
              args
              
                ,
              
              
                **
              
              kwargs
              
                )
              
              
                :
              
              
        self
              
                .
              
              write
              
                (
              
              
                "hello!"
              
              
                )
              
              
                def
              
              
                make_app
              
              
                (
              
              
                )
              
              
                :
              
              
                return
              
               tornado
              
                .
              
              web
              
                .
              
              Application
              
                (
              
              handlers
              
                =
              
              
                [
              
              
                (
              
              r
              
                "/"
              
              
                ,
              
               MainHandler
              
                )
              
              
                ]
              
              
                )
              
              
                if
              
               __name__ 
              
                ==
              
              
                '__main__'
              
              
                :
              
              
    app 
              
                =
              
               make_app
              
                (
              
              
                )
              
              
    app
              
                .
              
              listen
              
                (
              
              
                8089
              
              
                )
              
              
    IOLoop
              
                .
              
              current
              
                (
              
              
                )
              
              
                .
              
              start
              
                (
              
              
                )
              
            
          

  1. 闭包:就是函数内的函数引用内部函数外的变量,这个函数就是个闭包. ↩︎


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论