Python裝飾器的一些小知識

調(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í)行的時間全部都打出來。

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

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