python decorator snappet 1

1.什么是decorator?

裝飾器就是,裝飾你目標的東西。其實wapper來理解更好~就好比鋼鐵俠的盔甲!

def decorator(fun):
    def warrper(name):
        start = time.time()
        fun(name)
        runtime = time.time() - start

        print runtime
    return warrper

@decorator
def do_something(name):
    for i in range(10000000):
        pass
    print 'name:',name

if __name__ == '__main__':
    do_something('Li yun long')
name: Li yun long
0.27599978447

讓參數(shù)不固定:

def decorator(fun):
    def wapper(*args,**kwargs):
        start = time.time()
        fun(*args,**kwargs)
        runtime = time.time() - start
        print runtime
    return wapper

@decorator
def do_something(user,name):
    for i in range(10000000):
        pass
    print "user:",user
    print "name:",name

if __name__ == '__main__':
    do_something('Li yun long','yun long')
user: Li yun long
name: yun long
0.30999994278

改裝一下,讓它帶參數(shù),
···
def decorator(num):
def _decorator(fun):
def wapper(args,kwargs):
start = time.time()
for i in xrange(num):
fun(
args,**kwargs)
runtime = time.time() - start
print runtime
return wapper
return _decorator

@decorator(2)
def do_something(user,name):
for i in range(10000000):
pass
print "user:",user
print "name:",name

if name == 'main':
do_something('Li yun long','yun long')
···

user: Li yun long
name: yun long
user: Li yun long
name: yun long
0.5
尬圖1.png

不要試圖在里面些兩個,第二個不會運行的.


尬圖2.png

那么,調(diào)用順序呢?

def decorator(fun):
    print "decorator"
    def warrper():
        print "wapper"
        start = time.time()
        fun()
        runtime = time.time() - start
        print runtime
    return warrper

@decorator
def do_something():
    for i in range(10000000):
        pass
    print 'do_something'

它的結(jié)果是:


尬圖3.png

被裝飾器裝飾過的函數(shù)名:

def decorator(fun):
   #print "decorator"
   def warrper(name):
       #print "wapper"
       start = time.time()
       fun(name)
       runtime = time.time() - start
       print runtime
   return warrper


@decorator
def do_something(name):
   for i in range(10000000):
       pass
   print 'do_something',name

if __name__ == '__main__':
   print do_something.__name__
尬圖4.png

用functools:

import functools
def decorator(fun):
   @functools.wraps(fun)
   def warrper(name):
       start = time.time()
       fun(name)
       runtime = time.time() - start
       print runtime
   return warrper

@decorator
def do_something(name):
   for i in range(10000000):
       pass
   print 'do_something',name

if __name__ == '__main__':
   print do_something.__name__
尬圖5.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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