裝飾器簡介:給被裝飾的函數在不更改代碼的基礎上增加新的功能;
多個裝飾器的執行順序:從最靠近原始函數的裝飾器開始執行,最後執行原始函數;
直接上個簡單的例子就懂了:
一 最簡單的裝飾器:
#!/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關鍵字,生成器一定是迭代器;