使用装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
(
)
-
闭包:就是函数内的函数引用内部函数外的变量,这个函数就是个闭包. ↩︎