以前沒有用過裝飾器,也不知道它有什麼用。直到最近寫了乙個log函式,在直到原來python的裝飾器可以這麼方便。
1、原來debug訊息的寫法
假設有乙個process函式,原來是這麼寫的,
def process(*arg, **dic):
pass
後面,我們為了確認這個函式是否被呼叫了,那麼可以這麼寫,
def process(*arg, **dic):
print 'enter function process'
2、引入裝飾器
用上面那種print的方法沒有什麼問題,但是總是覺得非常麻煩,其實我們可以用乙個裝飾器來解決。
def log(func):
print 'enter function ' + func.__name__
return func(*arg, **dic)
3、使用裝飾器
看上去上面就是乙個普通的函式,沒有什麼特別之處。但是,它怎麼使用呢,其實很簡單,
@log有了這麼乙個裝飾器之後,那麼process函式在被呼叫的時候,就會預設呼叫log函式,從而列印相關的內容。def process(*arg, **dic):
print arg, dic
4、定製不同級別的訊息列印
上面的log函式雖然也能使用,但是總覺得不如分層列印好。乙個除錯函式,按道理來說,應該是按照info、warning、debug、error級別來分層列印的。所以,按照這個要求,我們也可以定製自己的訊息列印函式。
def debug_log(level):
if (1 == level):
print 'enter function ' + func.__name__
return func(*arg, **dic)
同樣,使用也非常容易,我們只需要在裝飾器內填入引數就可以了,
@debug_log(level = 1)5、完整範例def process(*arg, **dic):
print arg, dic
最後,我們給出整個範例**。希望大家可以在此基礎上多多練習。
#!/usr/bin/python
import os
import sys
import re
'''debug_log function
'''def debug_log(level):
if (1 == level):
print 'enter function ' + func.__name__
return func(*arg, **dic)
def log(func):
print 'enter function ' + func.__name__
return func(*arg, **dic)
'''real function
'''@debug_log(level = 1)
def process(*arg, **dic):
print arg, dic
'''file entry
'''def main():
process(1, 2, a=1)
if __name__ == '__main__':
main()
Python程式設計學習 裝飾器
簡介 裝飾器,python2.4版本引入的一種新特性。跟名字一樣,是用來裝飾的。其實裝飾器就是乙個函式,不過形式比較特殊,一般用 開頭,一般形式如下 deco deffoo pass上面的 等同於下面這句 foo deco foo 裝飾器既可以和上面一樣沒有引數,也可以是帶引數的 decomaker...
python裝飾器 Python 裝飾器
簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...
python裝飾器 裝飾器
由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...