裝飾器@


使用多個修飾器的話:

1.  #!/usr/bin/env python  
2.    
3.  def a(fn):  
4.      print 'a'  
5.      def d(st):  
6.          print st+'d'  
7.      return d  
8.    
9.  def b(fn):  
10.     print 'b'  
11.     return fn  
12.  
13. @a  
14. @b  
15. def c(st):  
16.     print st  
17.       
18. c('c')  

我們調(diào)用c('c')的時候會先調(diào)用b(c),b(c)打印字符"b"然后返回c,然后再調(diào)用a(c),a(c)打印字符"a",然后返回方法d,然后再執(zhí)行d('c'),打印cd。
先調(diào)用堆棧里的修飾器里面的函數(shù)然后執(zhí)行顯式的函數(shù)


后續(xù)補充:

雙層嵌套:
def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

@log
def now():
    print('2015-3-25')

>>> now()
call now():
2015-3-25

@log def now():
相當于執(zhí)行了語句:
now = log(now)

三層嵌套:
def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

@log('execute')
def now():
    print('2015-3-25')

>>> now()
execute now():
2015-3-25

@log('execute')
def now():
相當于 now = log('execute')(now)


Decorator 還可以為類增加額外的成員:
def hello(cls):
     cls.hello = staticmethod(lambda: "HELLO")
     return cls
@hello
class World(object):pass

>>>World.hello( )
'HELLO'

functools.wraps

在使用 Decorator 的過程中,難免會損失一些原本的功能信息

def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

@log('execute')
def now():
    print('2015-3-25')

>>> now.__name__
'wrapper'                 // 原本應該是now的

-----------------------------------------
加入 @functools.wraps(func) 保留原有的函數(shù)簽名
def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 匿名函數(shù): lambda 不需要顯式地定義函數(shù),直接傳入匿名函數(shù)更方便。 關鍵字lambda表示匿名函數(shù),冒號前面...
    MJXH閱讀 546評論 0 0
  • 匿名函數(shù) 1)匿名函數(shù)有個限制,就是只能有一個表達式,不用寫return,返回值就是該表達式的結果。 2)因為沒有...
    木凜閱讀 487評論 0 0
  • 裝飾器 裝飾器本質(zhì)上是一個Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返...
    時間之友閱讀 2,431評論 0 3
  • Python裝飾器的高級用法(翻譯) 原文地址https://www.codementor.io/python/t...
    城南道閱讀 4,867評論 1 22
  • 不知從什么時候開始,我愈發(fā)的甘于現(xiàn)狀,愈發(fā)的自我拋棄。 我停滯不前,我渾渾噩噩,我墮入深淵。我和蕓蕓眾生一樣,想...
    黛奎閱讀 298評論 0 1

友情鏈接更多精彩內(nèi)容