1.什么是decorator?
裝飾器就是襟士,裝飾你目標(biāo)的東西。其實(shí)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
不要試圖在里面些兩個(gè)说莫,第二個(gè)不會(huì)運(yùn)行的.
尬圖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