Python入門課程NO60課 函數裝飾器
裝飾器是一種軟件設計模式,可以對已有的對象進行功能上的擴展,而無需改變其結構。如何使用裝飾器來進行功能上的擴展?我們得先學習Python中的閉包函數。
閉包函數:簡單地理解,就是函數中定義的一個內部函數,該內部函數可以訪問外部函數作用域中的參數,變量。
使用閉包進行功能擴展(即:裝飾器):
假如我們有個項目在初期是允許任何訪問者查看的,代碼如下:
隨著項目的不斷迭代,我們需要方可登陸后才能瀏覽此頁面,那么我們就有兩種選擇,一種是直接修改welcome函數,另一種就是使用函數裝飾器,前面已經講過,函數裝飾器是對已有對象進行功能上的擴展,而不改變其結構。很明顯選擇裝飾器更為合適。我們來做一些修改。
裝飾器語法糖:
在上面的代碼片段中,不夠直觀和自然,因為需要將被裝飾的函數作為參數傳遞給裝飾器,還需要再執行返回的閉包函數,那么如何才能更優雅的使用呢?
Python中提供了語法糖,在函數頭前面加上一行@decortator的修飾符,可以對當前函數進行裝飾,decortator表示具體的裝飾器名。在上文的代碼中,login函數就是一種裝飾器,現在使用@符號來對welcome函數進行裝飾。以上程序可以修改為:
對welcome函數使用@login進行裝飾以后,Python會自動將wecome函數作為參數傳遞給login函數, 并執行返回的閉包函數,這是Python裝飾器的核心邏輯所在。裝飾器中的閉包函數參數須與被裝飾對象的參數一致,在不確定被裝飾對象的參數時,可以使用可變參數:*args, **kwargs。 使用可變參數的裝飾器結構:
裝飾器也是用來進行功能上的擴展。在面向對象中,裝飾器是一種軟件設計模式,可以對已有的對象進行功能上的擴展,而無需改變其結構。 閉包函數,簡單地理解,就是函數中定義的一個內部函數,該內部函數可以訪問外部函數作用域中的參數,變量。

- 上一篇
Python入門課程NO59課 匿名函數lambda表達式
匿名函數,也就是沒有函數名的函數。在Python中,通過lambda表達式來定義匿名函數。與之對應的是具名函數。具名函數即為有函數名的函數。通過def來定義的函數,就叫具名函數。也就是我們之前講解的函數。lambda表達式的語法結構:lambda parameters: expression舉例說明:由于
- 下一篇
Python入門課程NO61課 遞歸函數
所謂的遞歸函數,是指自己調用自己的函數。這里的調用不一定是直接調用,也可以是間接地調用。舉例說明:但這樣自身不斷的調用自身會陷入死循環當中,無法結束,因此python會拋出一個錯誤,指示該遞歸函數已超出了最大遞歸深度。因此遞歸函數必須能夠正常終止在設計遞歸函數時