調(diào)用時機(jī)
裝飾器的調(diào)用時機(jī)是在導(dǎo)入時,或者是加載時就執(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í)行,那么第一個打印出來的應(yīng)該是"running main()",但是實際上在第三行才打出來了,前面兩行都是裝飾器里面的內(nèi)容,用Debug模式來運行,看的比較清楚。

image
如圖所示,我在運行初識的時候打了一個端點,Debug模式運行后,程序已經(jīng)打印出了裝飾器的內(nèi)容。
------以上來自《流暢的Python》
裝飾器來打日志
之前一直有用過這塊,不過遇到了一點問題,在修飾類里面的函數(shù)時,經(jīng)常會出現(xiàn)參數(shù)錯誤的情況,因為類里面的函數(shù)第一個參數(shù)總是self,在執(zhí)行的時候經(jīng)常保參數(shù)不正確,這里分享一個我實踐成功的一個裝飾器函數(shù),可以解決這個問題。
# 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
這個裝飾器裝飾之后,會把執(zhí)行的函數(shù)名,入?yún)⒑蛨?zhí)行的時間全部都打出來。