python-裝飾器

裝飾器簡介:給被裝飾的函數在不更改代碼的基礎上增加新的功能;

多個裝飾器的執行順序:從最靠近原始函數的裝飾器開始執行,最後執行原始函數; 

直接上個簡單的例子就懂了: 

一 最簡單的裝飾器:

#!/usr/bin/python 

def deco(func1):

    print("111")

    def one():

        print("222")

        func1()

    return one


@deco

def myinit():

    print("init")


myinit()


原始函數myinit,作用輸出init;

裝飾器函數deco,用一個函數func1作爲參數,內部定義一個函數one,最後return one,形成閉包;

執行順序:先執行裝飾器函數deco外部的print("111"),再執行deco內部的print("222"),最後執行原始函數myinit;

結果爲:

111

222

init



二 多個裝飾器:

#!/usr/bin/python 

def deco(func1):

    print("111")

    def one():

        print("222")

        func1()

    return one


def deco2(func2):

    print("aaa")

    def two():

        print("bbb")

        func2()

    return two


@deco

@deco2

def myinit():

    print("init")


myinit()

原始函數myinit,作用輸出init;

裝飾器函數deco,用一個函數func1作爲參數,內部定義一個函數one,最後return one,形成閉包;

裝飾器函數deco2,用一個函數func2作爲參數,內部定義一個函數two,最後return two,形成閉包;

執行順序:先執行裝飾器函數deco2外部的print("aaa"),再執行裝飾器函數deco外部的print("111"),接着解釋器向下執行deco內部的print("222"),然後執行deco2內部的print("bbb"),最後執行原始函數myinit;

結果爲:

aaa

111

222

bbb

init



三 帶有不定參數的裝飾器

#!/usr/bin/python 

def deco(func1):

    print("111")

    def one(*args, **kwargs):

        print("222")

        func1(*args, **kwargs)

    return one


@deco

def myinit(a,b,c):

    print("sum is %d" % (a+b+c))


myinit(1,2,3)


結果爲:

111

222

sum is 6


順便贈送兩個概念:

迭代器:帶狀態的對象; 能在你調用next()方法的時候返回容器中下一個值,任何實現了__iter__和__next__()方法的對象都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下一個值,如果容器中沒有更多元素了,則拋出StopIteration異常;

生成器: 特殊的迭代器,更加優雅的實現,不需要通過__iter__()和__next__()方法,只需要一個yiled關鍵字,生成器一定是迭代器;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章