以前學過點 面向對象的知識,我感覺這之間是有關聯的,比如說裝飾器的第一個要素是對被裝飾的函數的封閉性,不允許更改;第二個就是對裝飾器本oj身的可擴展性。 裝飾器要點:高階函數+嵌套函數=裝飾器 需要掌握的知識點:1、函數即變數 2、高階函數(函數的參數也是函數) 3、嵌套函數 裝飾器一:裝飾器不帶參 ...
以前學過點 面向對象的知識,我感覺這之間是有關聯的,比如說裝飾器的第一個要素是對被裝飾的函數的封閉性,不允許更改;第二個就是對裝飾器本oj身的可擴展性。
裝飾器要點:高階函數+嵌套函數=裝飾器
需要掌握的知識點:1、函數即變數
2、高階函數(函數的參數也是函數)
3、嵌套函數
裝飾器一:裝飾器不帶參數,被裝飾的函數也不帶參數
簡單的需求:現有兩個簡單的列印內容的函數,現在需要在不改變兩個函數源代碼的情況下統計每個函數運行時間
import time
def timer(func):#用到高階函數
def deco():#用到函數嵌套
start_time = time.time()
func()
stop_time = time.time()
print("the func run %s" %(stop_time-start_time))
return deco
@timer
def test1():
time.sleep(3)
print("i am test1")
@timer
def test2():
time.sleep(3)
print("i am test2")
test1()
test2()
執行順序:首先程式自上往下走,走到定義的timer函數的時候會跳到@timer處,檢測到timer被作為裝飾器了,系統會去搜索哪些地方使用了timer作為裝飾器,搜索完成後,執行timer;緊接著執行我們調用的test1(),因為test1被timer裝飾了,所以會先去執行裝飾器,在裝飾器內部執行到func()時,此時func()就是test1()! test2()也是一樣
裝飾器的效果就是:沒有改變原來函數的源代碼和函數調用方式,又給函數增加了新功能
裝飾器二:被裝飾函數帶參數
裝飾器三:被裝飾函數有返回值
裝飾器四:裝飾器本身帶參數