python文法32[裝飾器decorator]

來源:互聯網
上載者:User

一 裝飾器decorator 

decorator設計模式允許動態地對現有的對象或函數封裝以至於修改現有的職責和行為,簡單地講用來動態地擴充現有的功能。其實也就是其他語言中的AOP的概念,將對象或函數的真正功能也其他輔助的功能的分離。
 

二Python中的decorator

python中的decorator通常為輸入一個函數,經過裝飾後返回另一個函數。  比較常用的功能一般使用decorator來實現,例如python內建的staticmethod和classmethod。

 

 

裝飾器有兩種形式:

@A
def foo():
    pass

 

相當於:

def foo():
    pass
foo = A(foo)

 

第二種為帶參數的:

@A(arg)
def foo():
    pass

 

則相當於:

def foo():
    pass
foo = A(arg)(foo)

 

可以看出第一種的裝飾器是個返回函數的函數,第二種的裝飾器是個返回函數的函數的函數。 

 

python中的decorator可以多個同時使用,如下:

 

@A
@B
@C
def f (): pass
    
# it is same as below
def f(): pass
f = A(B(C(f)))

 

三 Python中常用的decorator執行個體

decorator通常用來在執行前進行許可權認證,日誌記錄,甚至修改傳入參數,或者在執行後對返回結果進行預先處理,甚至可以截斷函數的執行等等。

執行個體1:

from functools import wraps
def logged(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print (func.__name__() + " was called")
        return func(*args, **kwargs)
    return with_logging

@logged
def f(x):
   """does some math"""
   return x + x * x

print (f.__name__)  # prints 'f'
print (f.__doc__)   # prints 'does some math'

 

注意functools.wraps()函數的作用:調用經過裝飾的函數,相當於調用一個新函數,那查看函數參數,注釋,甚至函數名的時候,就只能看到裝飾器的相關資訊,被封裝函數的資訊被丟掉了。而wraps則可以幫你轉移這些資訊,參見http://stackoverflow.com/questions/308999/what-does-functools-wraps-do 

 

參考: 
http://www.cnblogs.com/Lifehacker/archive/2011/12/20/3_useful_python_decorator.html#2277951 

 

完! 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.