使用裝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
(
)
-
閉包:就是函數內的函數引用內部函數外的變量,這個函數就是個閉包. ??
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
