2023年01月02日
⁄ 綜合 ⁄ 共 2016字 ⁄ 字型大小
小 中 大
原文檢視:
本文章的**
本篇文章將介紹python中的decorator,中文翻譯為 裝飾器 魔法。在這篇文章中我們將熟悉decorator使用的基本方式和基本使用例子,並利用decorator來實現乙個高階的例子—快取系統(cache system)。
decorator已某種方式可以簡化編碼量,並增加了**的可讀性,這也是為何python中引入了 裝飾器 魔法。我們可以看看如下例子:
def可以看出以上的**結構讓人看起來不舒服,如果使用了裝飾器,那麼一切將變得美好。foo(
self
):pass
foo
=classmethod
(foo
)
@classmethod在python中,裝飾器(decorator)是用於修改函式,類方法的python物件。裝飾器可以分為函式,類裝飾器,對裝飾器唯一的限制是 其可呼叫性(callable),我們知道,函式本身是可呼叫的,所以如果使用類裝飾器,我們就必須實現類的__call__方法。deffoo
(self
):pass
裝飾器必須用在合適的地方,否則並不能得到很好的效果,比如我們要用裝飾器實現以下的功能:
def使其輸出結果為 那麼我們可以建立如下的裝飾器:value
():return
"hello world!"
defli(然後這樣呼叫即可func
):return""+
func()+
""defh1(
func
):return
""
@h1即增加了**的可讀性,又提高**的可重用性。@lidef
value
():return
"hello world!"
value
()
看過一些簡單的使用方法後,我們可以用數學語言來描述裝飾器。
@f1等價於(arg
)@f2
deffunc
():pass
def當初我也在接觸到裝飾器一些簡單的使用方式後,並不對裝飾器很感興趣,因為我們畢竟可以用其他的方式實現其功能,但是後面無意中接觸到了用裝飾器做cache系統,讓我突然覺得有裝飾器的好處和妙處。func
():pass
func =f1
(arg
)(f2
(func
))
假如,我們有乙個如下遞迴,用來實現fibonacci_number遞迴
def這個遞迴有什麼問題呢,我們知道遞迴在通常情況下,會產生許多相同的子呼叫,因此我們需要乙個快取來儲存中間結果,可以加速遞迴過程。fib(n):
ifn
<2:
return
1return
fib(n-
1)+fib(n-2)
我們來對比一下使用cache系統之後的前後遞迴呼叫過程,以fib(5)為例:
可以發現重複呼叫子過程的現象消失,我還用profile對比了一下時間,後者快了許多,特別是當fib引數越大的時候,那我們如何實現這個cache系統,下面給出乙個簡單的版本:
from使用方法非常簡單functools
import
wraps
defcache
(func
):caches ={}
@wraps
(func
)def
wrap
(*args
):if
args
notin
caches
:caches
[args]=
func
(*args
)return
caches
[args
]return
wrap
@cache從上面我們看出,我們在沒有任何**修改的前提下實現了乙個簡單的cache系統,記住沒有修改任何**的前提下,還有就是並不是所有的遞迴都適合此類方法,比如二叉樹就沒有必要,當且只有重複的子過程呼叫時採用此方法才有實際意義,反之,畫蛇添足。deffib(n
):if
n <2:
return
1return
fib(n-
1)+fib(n
-2)print
fib(5)
#call fib so easy!
reference:
用python實現乙個簡單的cache系統
原文檢視 本篇文章將介紹python中的decorator,中文翻譯為 裝飾器 魔法。在這篇文章中我們將熟悉decorator使用的基本方式和基本使用例子,並利用decorator來實現乙個高階的例子 快取系統 cache system decorator已某種方式可以簡化編碼量,並增加了 的可讀性...
用Python實現乙個簡單的加密程式
生活中,有時候我們需要對一些重要的檔案進行加密,python 提供了諸如 hashlib,base64 等便於使用的加密庫。對於日常學習而言,我們可以借助異或操作,實現乙個簡單的檔案加密程式,從而強化自身的程式設計能力。基礎知識 在 python 中異或操作符為 也可以記作 xor。按位異或的意思是...
用python實現乙個簡單的詞云
對於在windows pycharm工具 裡實現乙個簡單的詞云還是經過了幾步小挫折,跟大家分享下,如果遇到類似問題可以參考 1.匯入wordcloud包時候報錯,當然很明顯沒有安裝此包。2.安裝過程中報乙個關於 vc 編譯器的錯誤。3.安裝wordcloud成功後,在pycharm裡面執行from ...