本文總結分析了Python裝飾器簡單用法。分享給大家供大家參考,具體如下:
裝飾器在python中扮演著很重要的作用,例如插入日志等,裝飾器可以為添加額外的功能同時又不影響業務函數的功能。
比如,運行業務函數fun()
同時打印運行花費的時間
1. 運行業務函數fun()
同時打印運行花費的時間
import timedef dec(fun): start = time.time() fun() end = time.time() a = end - start print adef myfun(): print 'run myfunction'dec(myfun)
運行結果
(virt2) root@ubuntu:/home/z# python z.py
run myfunction
0.00108599662781
但是每次運行myfun都要調用dec,下面作下變動解決這個問題
2.
import timedef dec(fun): def wrap(): start = time.time() fun() end = time.time() a = end - start print a return wrapdef myfun(): print 'run myfunction'myfun=dec(myfun)myfun()
運行結果:
(virt2) root@ubuntu:/home/z# python z.py
run myfunction
0.00122618675232
這個裝飾器dec就實現了,并且不影響函數myfun功能
3. 裝飾器@符
import timedef dec(fun): def wrap(): start = time.time() fun() end = time.time() a = end - start print a return wrap@decdef myfun(): print 'run myfunction'myfun()
結果
(virt2) root@ubuntu:/home/z# python z.py
run myfunction
0.000470876693726
使用了@后,就不用給myfun重新賦值了
@dec
就相當于myfun=dec(myfun)
例子:
def level(leveel): def debug(func): def wrapper(*args, **kwargs): print("[DEBUG]: enter {}()".format(func.__name__),leveel) return func(*args, **kwargs) return wrapper return debug@level(leveel='debuging')def say(something): print ("hello {}!".format(something))say(123)
輸出:
('[DEBUG]: enter say()', 'debuging')
hello 123!
'''class logging(object): def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print ("[DEBUG]: enter function {func}()".format( func=self.func.__name__)) return self.func(*args, **kwargs)@loggingdef say(something): print ("say {}!".format(something))'''class logging(object): def __init__(self, level='INFO'): self.level = level def __call__(self, func): # 接受函數 def wrapper(*args, **kwargs): print ("[{level}]: enter function {func}()".format( level=self.level, func=func.__name__)) func(*args, **kwargs) return wrapper #返回函數@logging(level='INFO')def say(something): print ("say {}!".format(something))say(123)
輸出:
新聞熱點
疑難解答