python的函數裝飾器學習筆記
1 基本函數
首先正常的函數形式和調用方法:
>>> def foo(): ... return 1 >>> foo() 1
2 嵌套函數
基本的嵌套函數形式和調用方法
>>> def outer(): ... x = 1 ... def inner(): ... print x # 1 ... inner() # 2 >>> outer() 1
函數inner所定義在函數outer中。inner可以訪問到他的外層函數的變量。
3. 函數即對象
>>> issubclass(int, object) # all objects in Python inherit from a common baseclass True >>> def foo(): ... pass >>> foo.__class__ # 1 <type 'function'> >>> issubclass(foo.__class__, object) True
函數即對象,所以可以將函數當成普通的對象變量一樣,可以作為普通的參數,也可以作為一個函數的返回值。
>>> def outer(): ... x = 1 ... def inner(): ... print x+1 ... return inner ... >>> f = outer() >>> f() 2
這里outer函數就是將inner函數返回給f
4 裝飾函數
>>> def outer(some_func): ... def inner(): ... print 'before some_func' ... ret = some_func() ... return ret + 1 ... return inner ... >>> def foo(): ... return 1 ... >>> decorated = outer(foo) >>> decorated() before some_func 2 >>>
這里將foo函數當作參數傳遞給outer函數,outer函數中定義了一個inner函數,inner中調用了傳遞進來的foo函數,并在調用之行之前打印文字。outer函數醬inner函數返回給decorated(這里并沒有執行inner函數)。然后執行decorated()
這里decorated通過outer函數將foo函數裝飾了一下(在執行之前打印一句話)
5 使用@裝飾符
>>> def outer(some_func): ... def inner(): ... print 'before some_func' ... ret = some_func() ... return ret + 1 ... return inner ... >>> @outer ... def foo(): ... return 1 ... >>> foo() before some_func 2 >>>
這里不再明確的使用調用outer將foo當作參數傳遞,然后用decorated接受。而直接用@outer放在foo函數定義開頭,即可實現使用outer函數裝飾foo的功能。之后直接調用foo即可。
6 函數裝飾傳遞參數
>>> def logger(func): ... def inner(*args, **kwargs): ... print "func start" ... func(*args, **kwargs) ... print "func end" ... return inner ... >>> @logger ... def foo(a, b): ... print a + b ... >>> foo(1, 2) func start 3 func end >>>
logger中定義的inner函數用*args和**kwargs接受參數,傳遞給func函數執行。即完整實現一個函數裝飾器的功能,之后用@logger裝飾函數foo,在執行foo函數時,能看到在其之前之后打印的語句。
詳細學習地址:http://simeonfranklin.com/blog/2012/jul/1/python-decorators-in-12-steps/
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!