python的函數裝飾器學習筆記

jopen 8年前發布 | 12K 次閱讀 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/




來自: http://my.oschina.net/u/2299936/blog/552971

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!