調(diào)用時(shí)機(jī)
裝飾器的調(diào)用時(shí)機(jī)是在導(dǎo)入時(shí),或者是加載時(shí)就執(zhí)行泉懦,如下代碼:
register = []
def regester(func):
print 'running regisster ({0})'.format(func)
register.append(func)
return func
@regester
def f1():
print "running f1()"
@regester
def f2():
print "running f2()"
def f3():
print "running f3()"
def main():
print "running main()"
print register
f1()
f2()
f3()
其執(zhí)行結(jié)果如下:
running regisster (<function f1 at 0x1035ae5f0>)
running regisster (<function f2 at 0x1035ae668>)
running main()
[<function f1 at 0x1035ae5f0>, <function f2 at 0x1035ae668>]
running f1()
running f2()
running f3()
按照正常的代碼執(zhí)行邏輯要執(zhí)行,那么第一個(gè)打印出來的應(yīng)該是"running main()"
,但是實(shí)際上在第三行才打出來了籽懦,前面兩行都是裝飾器里面的內(nèi)容,用Debug模式來運(yùn)行氛魁,看的比較清楚暮顺。
image
如圖所示,我在運(yùn)行初識(shí)的時(shí)候打了一個(gè)端點(diǎn)秀存,Debug模式運(yùn)行后捶码,程序已經(jīng)打印出了裝飾器的內(nèi)容。
------以上來自《流暢的Python》
裝飾器來打日志
之前一直有用過這塊或链,不過遇到了一點(diǎn)問題惫恼,在修飾類里面的函數(shù)時(shí),經(jīng)常會(huì)出現(xiàn)參數(shù)錯(cuò)誤的情況澳盐,因?yàn)轭惱锩娴暮瘮?shù)第一個(gè)參數(shù)總是self
祈纯,在執(zhí)行的時(shí)候經(jīng)常保參數(shù)不正確,這里分享一個(gè)我實(shí)踐成功的一個(gè)裝飾器函數(shù)叼耙,可以解決這個(gè)問題腕窥。
# ecoding=utf-8
# Author: 翁彥彬 | Sven_Weng
# Email : sven_weng@wengyb.com
# Web : http://wybblog.applinzi.com
import time
import functools
def log(func):
@functools.wraps(func)
def inner_methods(*args, **kwargs):
t0 = time.time()
result = func(*args, **kwargs)
t1 = time.time()
name = func.__name__
arg_list = []
if args:
arg_list.append(', '.join([str(arg) for arg in args]))
if kwargs:
pairs = ['{0}={1}'.format(k, w) for k, w in sorted(kwargs.items())]
arg_list.append(', '.join(pairs))
print "[{0}]func_name:{1},args:({2})".format(str(t1 - t0), name, arg_list)
return result
return inner_methods
這個(gè)裝飾器裝飾之后,會(huì)把執(zhí)行的函數(shù)名筛婉,入?yún)⒑蛨?zhí)行的時(shí)間全部都打出來油昂。