首頁  >  文章  >  後端開發  >  python之裝飾器詳解

python之裝飾器詳解

高洛峰
高洛峰原創
2016-10-19 16:06:361171瀏覽

裝飾器的語法以@開頭,接著是裝飾器函數的名字、可選參數。

緊跟著裝飾器宣告的是被裝飾的函數和被裝飾的函數的可選參數,如下:

@decorator(dec_opt_args)

def func(func_args):

  ...

def func(func_args):

  ....

說起來,裝飾器其實也就是一個函數,一個用來包裝函數的函數,裝飾器在函數聲明完成的時候被調用,調用之後聲明的函數被換成一個被裝飾器裝飾過後的函數。

如:

def deco(func):
   ...
   return func
@deco
def foo():
      print 'foo'
#-----------------------------------
#等价如下:
def deco(func):
   ...
   return func
def foo():
      print 'foo'
foo = deco(foo)
如下例子:
def deco1(func):
    print 'ok'
    return func
@deco1
def foo():
    print 'foo'
foo()
#输出--------------
#ok
#foo
#------------------

如果不使用裝飾器,則可如下:

def deco1(func):
    print 'ok'
    return func
def foo():
    print 'foo'
print foo           #<function foo at 0x00AFE6F0>
foo = deco1(foo)   
foo()
#输出--------------
#ok
#foo
#------------------

兩者對比下,可發現使用裝飾器是那麼簡便、靈活。特別是在企業級的開發上。

同時也可以多個裝飾器重疊使用:

def deco1(func):
    print &#39;deco1&#39;
    return func
def deco2(func):
    print &#39;deco2&#39;
    return func   
@deco1
@deco2
def foo():
    print &#39;foo&#39;
foo()
#输出如下:-----------
#deco2
#deco1
#foo
#---------------------

等效於:

@deco1
@deco2
def foo(arg):pass
-----------与下等效----------
foo = deco1(deco2(foo()))

二、有參、無參的裝飾器

上面的例子基本上都是有參數的,無參數更為簡單。

1、無參

@deco1

@deco2

def foo(arg):pass

---------------------

foo = deco1(deco2(foo()))

   

2、有參

@deco1(deco_arg)

@deco2

def foo(arg)

@deco2

def foo(arg)

--

-- ----------

foo = deco1(deco_arg)(deco2(foo()))

回傳以函數為參數的裝飾器

三、用處

1、引用日誌

2 、增加計時邏輯來偵測效能

3、給函數加入事務的能力🎜🎜四、實例🎜
from time import ctime,sleep
def deco(func):
    def decoIn():
        print &#39;[%s]:%s called&#39; %(ctime(),func.__name__)
        return func
    return decoIn
@deco
def foo():
    pass
foo()
sleep(4)
for i in range(2):
    sleep(1)
    foo()
      
#输出如下:--------
#[Fri Jul 05 10:45:04 2013]:foo called
#[Fri Jul 05 10:45:09 2013]:foo called
#[Fri Jul 05 10:45:10 2013]:foo called
#------------------
🎜🎜🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn