Python裝飾器的進階用法(翻譯)

來源:互聯網
上載者:User

標籤:ssi   size   解決   time_t   point   功能   步驟   code   而不是   

原文地址https://www.codementor.io/python/tutorial/advanced-use-python-decorators-class-function

 

介紹

我寫這篇文章的主要目的是介紹裝飾器的進階用法。如果你對裝飾器知之甚少,或者對本文講到的知識點易混淆。我建議你複習下裝飾器基礎教程。
本教程的目標是介紹裝飾器的一些有趣的用法。特別是怎樣在類中使用裝飾器,怎樣給裝飾器傳遞額外的參數。

 裝飾器 vs 裝飾器模式

Decorator模式是一個物件導向的設計模式,它允許動態地往現有的對象添加行為。當你裝飾了一個對象,在某種程度上,你是在獨立於同一個類的其他執行個體的基礎上擴充其功能。
Python裝飾器不是裝飾器模式的實現,它在函數、方法定義的時候添加功能,而不是在啟動並執行時候添加。Decorator設計模式本身可以在Python中實現,因為Python是動態程式設計語言,所以沒有必要這樣做。

 一個基礎的裝飾器

這是裝飾器的最簡單例子,在繼續往下面閱讀之前請確保理解此段代碼。如果你需要更多關於此代碼的解釋,請複習下基礎裝飾器教程。

 帶參數的裝飾器

有時候帶參數的裝飾器會非常有用,這種技術經常用在函數註冊中。在web架構Pyramid中經常有用到,例如:

比方說,我們有一個使用者可以登入並且可以和使用者互動的GUI應用程式。使用者和GUI介面的互動觸發事件,導致Python函數執行。假設有許多使用該圖形介面的使用者,他們各自的權限等級差異很大,不同的功能執行需要不同的許可權。比如,考慮以下功能:

一種實現這些許可權檢查的方式是實現多個裝飾器,比如

但是,這太可怕了。這需要大量的複製粘貼,每個裝飾器需要一個不同的名字,如果有任何關於許可權檢查的改變,每個裝飾器都需要修改。就沒有一個裝飾器把以上三個裝飾器的工作都幹了的嗎?
為瞭解決此問題,我們需要一個返回裝飾器的函數:

嘗試一下調用 delete_usernew namepremium_checkpoint然後看看發生了什麼。
premium_checkpointdelete_user 產生了一個 “permission denied”的異常, new_game執行正常。
下面是帶參數裝飾的一般形式,和例子的使用:

等價於:

 類裝飾器

裝飾器不僅可以修飾函數,還可以對類進行裝飾。比如說,我們有一個類,該類含有許多重要的方法,我們需要記錄每一個方法執行的時間。我們可以使用上述的time_this裝飾此類:

 

此方法可以運行正常。但是在該類中存在許多多餘的代碼,如果我們想建立更多的類方法並且遺忘了裝飾其中的一個方法,如果我們不想裝飾該類中的方法了,會發生什麼樣的情況呢?這可能會存在出現認為錯誤的空間,如果寫成這樣會更有好:

等價於:

那麼time_all_class_methods是怎麼工作的呢?
首先,我們需要採用一個類作為參數,然後返回一個類,我們也要知道返回的類的功能應該和原始類ImportantStuff功能一樣。也就是說,我們仍然希望做重要的事情,我們希望記錄下每個步驟發生的時間。我們寫成這樣:

 總結

在此篇教程中,我們給大家展示了一些Python裝飾器使用的技巧-我們介紹了怎麼樣把參數傳遞給裝飾器,怎樣裝飾類。但是這僅僅是冰山一角。除了本文介紹的之外,還有其他好多裝飾器的使用方法,我們甚至可以使用裝飾器裝飾裝飾器(如果你有機會使用到它,這可能是一個做全面檢查的好方法)。Python有一些內建的裝飾器,比如:staticmethodclassmethod
閱讀完本文還需要學習什麼呢?通常是沒有比我在文章中展示的裝飾器更複雜的了,如果你有興趣學習更多關於改變類功能的方法,我建議您閱讀下繼承和OOP設計原則。或者你可以試試閱讀一下元類。



參考

 

 

 

 

 

 




Python裝飾器的進階用法(翻譯)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.