1. 程式人生 > >Python自學之樂-裝飾器淺談

Python自學之樂-裝飾器淺談

擴展性 func 可擴展性 函數調用 順序 簡單的 代碼 tar 統計

以前學過點 面向對象的知識,我感覺這之間是有關聯的,比如說裝飾器的第一個要素是對被裝飾的函數的封閉性,不允許更改;第二個就是對裝飾器本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()
執行順序:首先程序自上往下走,[email protected]
/* */,檢測到timer被作為裝飾器了,系統會去搜索哪些地方使用了timer作為裝飾器,搜索完成後,執行timer;緊接著執行我們調用的test1(),因為test1被timer裝飾了,所以會先去執行裝飾器,在裝飾器內部執行到func()時,此時func()就是test1()! test2()也是一樣
裝飾器的效果就是:沒有改變原來函數的源代碼和函數調用方式,又給函數增加了新功能

裝飾器二:被裝飾函數帶參數
裝飾器三:被裝飾函數有返回值
裝飾器四:裝飾器本身帶參數



Python自學之樂-裝飾器淺談