之前就瞭解到了裝飾器, 但是就會點皮毛, 而且對其調用方式感到迷茫,正好現在的項目我想優化,就想到了用裝飾器, 因此深入研究了下裝飾器.先看下代碼: 我的疑惑就是明明return 的是一個函數名,按道理來講,返回的就是一個函數地址啊!我理解有問題?隨後上網查資料,又是閉包....但是我個人對它不感冒 ...
之前就瞭解到了裝飾器, 但是就會點皮毛, 而且對其調用方式感到迷茫,正好現在的項目我想優化,就想到了用裝飾器, 因此深入研究了下裝飾器.
先看下代碼:
import time # 將函數作為參數傳入到此方法.... def timeif(func): def wrapper(arg): print("in wrapper() %s" % (arg)) start = time.clock() func(arg) end = time.clock() print("used: %s %s" % (end-start, arg)) return wrapper @timeif def foo(arg): print("in foo() %s" % (arg)) if __name__ == '__main__': foo(" Hello ") # 表示執行foo函數....
我的疑惑就是明明return 的是一個函數名,按道理來講,返回的就是一個函數地址啊!我理解有問題?隨後上網查資料,又是閉包....但是我個人對它不感冒,隨後自己分析,總結出了一段程式,看完你就知道原因了.
程式:
# coding=utf-8 # 帶參數的函數 返回一個函數地址就行.... def funX(x): def funY(): return x return funY # 不帶參數的函數.... def funX1(): print("調用函數funX1") def funY1(): print("調用函數funY1") return funY1 if __name__ == '__main__': # print(funX(5)()) # 調用有參數的嵌套函數... print(funX1()()) # 調用無參數的嵌套函數...
這和我們的裝飾器不像嗎?這就是我們的裝飾器!因此,我們可以按照上面的程式來理解,也就是說它是首先確定參數個數,隨後分別傳入的,下麵,我們來改寫代碼:
# coding=utf-8 import time # 將函數作為參數傳入到此方法.... def timeif(func): def wrapper(arg): print("in wrapper() %s" % (arg)) start = time.clock() func(arg) end = time.clock() print("used: %s %s" % (end-start, arg)) return wrapper # @timeif def foo(arg): print("in foo() %s" % (arg)) if __name__ == '__main__': timeif(foo)(' Hello')