国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

簡單上手Python中裝飾器的使用

2020-01-04 18:05:03
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了Python中裝飾器的使用,是Python進階學習中的重要知識,需要的朋友可以參考下

Python的裝飾器可以實現在代碼運行期間修改函數的上下文, 即可以定義函數在執行之前進行何種操作和函數執行后進行何種操作, 而函數本身并沒有任何的改變。

這個看起來很復雜, 實際上應用到了我之前說過的閉包的概念, 仔細看一看, 其實并不復雜。

首先, 我們先定義一個函數, 這個函數可以輸出我的個人昵稱:

 

 
  1. def my_name(): 
  2. print "Yi_Zhi_Yu" 
  3. my_name() # Yi_Zhi_Yu 

那假如我需要在個人昵稱輸出前, 在輸出我的個人uid呢, 當然, 要求是不改動現有的my_name函數, 這個時候就可以使用裝飾器了

首先, 裝飾器也是個函數, 其次, 他需要接受一個參數,該參數表示了要被裝飾的函數(即my_name):

 

 
  1. def my_info(func): 
  2. def wrapper(*args, **params): 
  3. print 218 
  4. return func(*args, **params) 
  5. return wrapper 

然后與相應的被裝飾函數關聯起來的方法就是使用@my_info寫在被裝飾函數的前面

 

 
  1. @my_info 
  2. def my_name(): 
  3. print "Yi_Zhi_Yu" 

最后, 在執行my_name的時候, 就能既輸出我的uid, 又能輸出我的昵稱了

 

 
  1. my_name() 
  2. #218 
  3. #Yi_Zhi_Yu 

在上面, 最讓我們疑惑的是裝飾器函數定義里面的wrapper函數, 裝飾器本身返回的是wrapper函數的定義, 而wrapper中則定義了對被裝飾函數(my_name)的調用, func表示的就是被裝飾函數, 說白了, 裝飾器只是把某個不得改動的函數(a)放到另一個函數(b)中, 在b里面調用a, 在調用前后就可以做所謂的看起來像裝飾的工作了。

my_info的最終返回的wrapper函數的定義, 并不是執行結果,只有當wrapper真正執行的時候, 才會真正的執行my_name方法, 這就是閉包時所說的內容。

wrapper中的參數, 實際上則是傳遞給func(實際上是my_name)的參數

因為裝飾器也是個函數, 那么裝飾器自己的能不能有參數傳遞呢??梢裕?不過需要定義一個更高階的函數, 也就是外面還要套一層函數, 比如, 我還要輸出我的自定義的一個信息,需要傳遞參數

 

 
  1. def c_info(text): 
  2. def my_info(func): 
  3. def wrapper(*args, **params): 
  4. print text 
  5. print 218 
  6. return func(*args, **params) 
  7. return wrapper 
  8. return my_info 
  9.  
  10. #使用裝飾器 
  11. @c_info("Tony"
  12. def my_name(): 
  13. print "Yi_Zhi_Yu" 
  14.  
  15. my_name() 
  16. #Tony 
  17. #218 
  18. #Yi_Zhi_Yu 

與前面的那個裝飾器相比, 僅僅是多了個外層, 內層也僅僅是增加了對外層傳入參數(text)的調用

總而言之, Python在函數定義中支持了對oop思想中的裝飾器的實現, 其本質也只是使用了閉包的思路, 延遲調用, 并在調用前后增加自己的其他實現內容

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 惠水县| 炎陵县| 新河县| 喀喇沁旗| 凤冈县| 万山特区| 唐海县| 宝坻区| 乡城县| 时尚| 台中县| 乐山市| 徐水县| 云和县| 扶绥县| 麻栗坡县| 苗栗县| 北流市| 芮城县| 竹北市| 荣昌县| 娱乐| 城步| 祥云县| 兴国县| 波密县| 丁青县| 海林市| 始兴县| 永济市| 余庆县| 沅江市| 虞城县| 新泰市| 申扎县| 长葛市| 伊金霍洛旗| 康平县| 海阳市| 乌什县| 土默特右旗|