




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
17-強大的裝飾 存等等的任務都會用到。然而,在平常工作生活中,我發現不少人,尤其是初學者,常常因為其相對復雜的表示,對裝飾器望而生畏,認為它“toofancytolearn”,實際并不如此。今天這節課,我會以前面所講的函數、閉包為切入點,引出裝飾器的概念、表達和基本用法,最后,再通過實際工程中的例子,讓你再次加深理解。 函數回 起來復 第點,我們要知道,在Python中,函數是 等公民(first-classcitizen),函數也是對象。我們可以把函defdefprint('Gotamessage:sendmessage=send o#輸Gotao這個例子中,我們把函數unc()賦予了變量en_mesge,這樣之后你調用en_mesae,就相當于是調用函數uc defdefgetreturn'Gotamessage:'+defrootcall(func,rootcall(getmessage, o#Gotao這中就_以形,函)調它。第三點我們以在數里義函,也是函的套。這我同舉了 個例子:defdefdefgetprint('Gotamessage:{}'.format(message))returngetmessage(message) o#Gotaodeffuncdeffuncdefgetprint('Gotamessage:{}'.format(message))returngetmessagesendmessage=funcclosure()sendmessage(' oworld')#輸Gotaosend_message,再調用send_message(‘oworld’),最后輸出了'Gotamessage: 簡單 defdefmydecorator(func):defwrapper():print('wrapperofreturndef ogreet=mywrapperofdecoratoroworld這段代碼中,變量gee指向了內部函數wrape(,內函wappe中又會調用原函數gee,因此,最后調用gee時,就會先打印wperfer',然后輸出' owd。這里的數y_ecoao)就是 個裝飾器,它把真正需要執行的函數gee包裹在其中,并且改變了它的行為,但是原函數gee不變。defdefmydecorator(func):defwrapper():print('wrapperofdecorator')return@mydecoratordefgreet(): o這里的,我們稱之為語法糖,ycar就相當于前面的emerrr)語句,只不過更加簡潔。因此,如果你的程序中有其它函數需要做類似的裝飾,你只需在它們的上方加帶有參數的裝飾器defmydecorator(func):defdefmydecorator(func):defwrapper(message):print('wrapperofdecorator')return@mydefgreet(message):o#輸wrapperwrapperofdecoratoroworld不過,新的問題來了。如果我另外還有 個函數,也需要使用my_decorao裝飾器,但是這個新的函數有兩個參數,又該怎么辦呢?比如:@my@mydefcelebrate(name,defdefmydefwrapper(*args,**kwargs):print('wrapperofdecorator')func(*args,**kwargs)return帶有其實,裝飾器還有更大程度的靈活性。剛剛說了,裝飾器可以接受原函數任意類型和數量的參數,除此之外,它還可以接受自己定義的參數。舉個例子,比如要定義 個參數,來表示裝飾器內部函數被執行的次數,那么就可以寫成下面這種形defdefdefmydefwrapper(*args,**kwargs):foriinrange(num):print('wrapperofdecorator')func(*args,**kwargs)returnreturnmydefgreet(message):o#輸出wrapperofowrapperofwrapperofwrapperof原函 ##輸出輸Helponfunctionwrapperin mainwrapper(*args,你會發現,gee()函數被裝飾以后,它的元信息變了。元信息告訴我們“它不再是以前的那個gee而是被wrappe函數取代了”。為了解決這個問題,我們通常使用內置的裝飾器@clsr,它會幫助保留原函數的元信息(也就是將原函數的元信息,拷貝到對應的裝飾器函數里)。importimportdefmydecorator(func):defwrapper(*args,**kwargs):print('wrapperofdecorator')func(*args,**kwargs)return@mydefgreet(message):greet.#輸類裝飾器前面我們主要講了函數作為裝飾器的用法,實際上,類也可以作為裝飾器。類裝飾器主要依賴于函數 ),每當你調用 個類的示例時,函數 l就會被執行 次。classclass init(self,func):self.func=funcself.numcalls=0 call(self,*args,**kwargs):self.numcalls+=1print('numofcallsis:{}'.format(self.numcalls))returnself.func(*args,**kwargs)def o#輸出numofcallsis:1oworld#輸numofcallsis:2oworld這里,我們定義了類Count,初始化時傳入原函數func(),而call()函數表示讓變量num_calls自增次調用函數裝飾回顧剛剛講的例子,基本都是 個裝飾器的情況,但實際上,Pyhon也支持多個裝飾器,比如寫成下面這樣的形式:def這樣 oworld'這個例子,就可以改寫成下面這樣importimportdefmydecorator1(func):defwrapper(*args,**kwargs):print('executedecorator1')func(*args,**kwargs)returndefmydecorator2(func):defwrapper(*args,**kwargs):print('executedecorator2')func(*args,**kwargs)return@mydecorator1@mydef o#輸executedecorator1executeo到此,裝飾器的基本概念及用法我就講完了,接下來,我將結合實際工作中的幾個例子,帶你加深對它的理解。認首先是最常見的認證的應用。這個很容易理解,舉個最常見的例子,你登錄 ,需要輸入用戶名密碼,然后點擊確認,這樣,服務器端便會查詢你的用戶名是否存在、是否和匹配等等。如果認證通過,你就可以順利登錄;如果不通過,就拋出異常并提示你登錄失敗。 些,你不登錄也可以瀏覽內容,但如果你想要發布文章或留言,在點擊發布時,服務器端便會我們來 importimportdefdefdefwrapper(*args,**kwargs):request=args[0]ifcheckuserloggedin(requestreturnfunc(*args**kwargs執?函數postraiseException('Authenticationfailed')returnwrapperdefpostcomment(request,這段代碼中,我們定義了裝飾器authenticate;而函 ment(),則表示用戶對某篇文章的論。每次調用這個函數前,都會先檢查用戶是否處于登錄狀態,如果是登錄狀態,則允許這項操作;如果沒有登錄,則不允許。日志記錄 importtimeimportimporttimeimportfunctoolsdeflogexecutiondefwrapper(*args,**kwargs):start=time.perfcounter()res=func(*args,**kwargs)end=time.perfcounter()print('{}took{}ms'.format(,(endreturnresreturnstart)*@logexecutiondefcalculate這里,裝飾器log_eecuon_tie記錄某個函數的運行時間,并返回其執行結果。如果你想計算任何函數的執行時間,在這個函數上方加上oeuote即可。輸入在大型公司的機器學習框架中,我們調用機器集群進行模型訓練前,往往會用裝飾器對其輸入(on文件)進行合理性檢查。這樣就可以大大避免,輸入不正確對機器造成的巨大開銷。importimportdefvalidationcheck(input):defwrapper(*args,...#檢查輸?是否合@validationdefneuralnetworktraining(param1,param2,其實在工作中,很多情況下都會出現輸入不合理的現象。因為我們調用的訓練模型往往很復雜,輸入的文件有成千上萬行,很多時候確實也很難發現。 緩cache為例來說明(如果你不了解LRUcache,可以點擊自行查閱)。LRUche,在Pyhn中的表示形式是lche。_ce會緩存進程中的函數參數和結果,當緩存滿了以后,會刪除leastenlyud的數據。 大型公司服務器端的代碼中往往存在很多關于設備的檢查,比如你使用的設備是安卓還是,版本號 Androidv200+)。 來,我們通常使用緩存裝飾器,來包裹這些檢查函數,避免其被反復調用,進而提高程序運行效率,@lru@lrudefcheck(param1,param2檢查??設備類型,版本號等這節課,我們 起學習了裝飾器的概念及用法。所謂的裝飾器,其實就是通過裝飾器函數,來修改原函數的些功能,使得原函數不需要修改。Decoratorsistomodifythebehaviorofthefunctionthroughawrappersowedon’thavetoactuallymodifythefunction.而實際工作中,裝飾器通常運用在認證、日志記錄、輸入合理性檢查以及緩存等多個領域中。合理使用裝飾器,往往能極大地提高程序的可讀性以及運行效率。那么,你平時工作中,通常會在哪些情況下使用裝飾器呢?歡迎留言和我討論,也歡迎你把這篇文章給 Wing·三金2019-06-17@functools.wraps(func)[5程序員人生2019-06-17 用性,降低耦合度,提高開發效率。[3贊]作者回復2019-06-172、類裝飾器在實際中有哪些應用場景呢[3作者回復2019-06-17性檢查,他也常常可以寫成類裝飾器的形式,進行調用。寫成類的話,優點是程序的分解度更加高,具體用類裝飾器和函數裝飾器,視情況而定,二者本質是 樣的farFlight2019-06-17請 下,lrucache不是應該刪除最久沒有的內容嗎。[2贊作者回復2019-06-17LRUcacheistoremovetheleastrecentlyuseddatawhenthecacheisfull。翻譯過來可能有點問題,意Fei2019-06-17老師好,num_calls不是實例屬性?example實例對象次,call兩次實例屬性num_calls得到2。謝謝!Geek59f23e2019-06-17 另外這里還是有點疑問,類裝飾器被調用兩次時el.nuclls這個變量不是實例變量么,第二次調用時為什么沒有生成新的實例,同時把之前的實例變量清空呢? 緩存節中,代碼頭加上fromfunctoolsimportlru_cache 層 層的堆棧結構,框架好像都少不了使用閉包裝飾器。[1贊Hector2019-06-17lrucache常用來做些小規模緩存,比如最近瀏覽記錄,空間瀏覽記錄等等,常用三種策略:1.FIFO(先進先出)2.最少使用LRU3.最近最少使用LRU.看了下源碼,原來python原生的functools中的lru是鏈表寫的[1贊]三水2019-06-17第1點:send_message=func第4點:send_message=第1點:send_message=第4點:send_message=想知道這是 個知識點,謝謝[1贊作者回復2019-06-17 點直接賦值send_message=func()是錯誤的,因為func()必須接受 個參數,send_message=func('oworld')就
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司組織業余活動方案
- 公司組合活動策劃方案
- 公司活動宣傳策劃方案
- 2025年心理學研究生入學考試試卷及答案
- 2025年全球化與國際關系研究生入學考試題及答案
- 2025年科學傳播專業研究生入學考試試題及答案
- 2025年礦業工程與安全管理考試題及答案
- 2025年翻譯與口譯專業資格考試試卷及答案
- 2024年度浙江省護師類之主管護師考前沖刺試卷B卷含答案
- 2024年度浙江省二級造價工程師之建設工程造價管理基礎知識模擬預測參考題庫及答案
- 高等職業學校礦物加工技術專業 實訓教學條件建設標準
- 建設單位質量安全保證體系
- 小學生反洗錢知識講座
- 養殖業技術知識培訓課件
- 慢性傷口護理中的柔性可穿戴設備應用
- 業務部門協作與協同計劃
- 2025年陜西省公民科學素質大賽考試題(附答案)
- 2025年蘭州石化職業技術大學單招職業技能測試題庫帶答案
- 教學課件-金融學概論(第2版-蓋銳)
- 人為關懷在骨科護理中的應用
- 人工智能算法模型定制開發合同
評論
0/150
提交評論