python 裝飾器做快取

2021-09-24 00:02:24 字數 1360 閱讀 1462

裝飾器在之前的文章中有講過,這裡主要是說了裝飾器的用法和應該怎麼理解。這片文章給出一片補充:主要說在快取方面的應用。

在此之前呢,需要補充一些知識點:就是 python 查詢變數的順序是什麼?

答案就是legb原則:也就是`local -> enclosed -> global -> built-in`
也就是先在區域性作用域內(例如函式內)進行查詢,然後在[閉包]1

內查詢,接下來分別是全域性作用域和內建的保留名稱

注意:閉包內的變數,不能改變,但是對於列表型別或是字典型別的話,可以進行修改內部的值。這也是用裝飾器作為快取的關鍵地方!

# coding=utf8

import tornado

from tornado.web import requesthandler

from tornado.ioloop import ioloop

from functools import wraps

defcache

(func)

: x =[0

] @wraps(func)

def(

*args,

**kwargs)

:# print args, kwargs

self = args[0]

x[0]

+=int

(self.get_argument(

"x")

)print x

return func(

*args,

**kwargs)

class

mainhandler

(requesthandler)

: @cache

defget(self,

*args,

**kwargs)

:# print "yes"

# print self.get_argument("x")

self.write(

"yes!"

)def

post

(self,

*args,

**kwargs)

: self.write(

"hello!"

)def()

:[(r"/"

, mainhandler)])

if __name__ ==

'__main__':)

8089

) ioloop.current(

).start(

)

閉包:就是函式內的函式引用內部函式外的變數,這個函式就是個閉包. ↩︎

使用裝飾器為Python函式做快取

寫了個函式作為裝飾器為fibonacci數列做快取,做了一下效能比較。usr bin python coding utf 8 import datetime now datetime.datetime.now from functools import wraps def cache func ca...

cached property快取裝飾器

class cached property object def init self,func,name none self.func func self.doc getattr func,doc self.name name or func.name def get self,instance,c...

python裝飾器 Python 裝飾器

簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...