裝飾器主要用於程式功能的一些擴充套件。
由於在python中,函式名(不帶括號)也是一種變數名,可以像賦值一樣給另外乙個變數。這就導致了裝飾器這種玩法。
其實函式名就是儲存著函式的位址,因此,可以把這個位址賦值給另外乙個變數,與c語言中的指標基本一樣,同時與python列表的引用也是相像的。
不附加新引數的裝飾器比較簡單
defdecorator(func):
definner():
.擴充套件的功能
.func()
擴充套件的功能
return inner
defnew_old():
.....
new_old=decorator(new_old) #①將函式new_old傳遞給形參func,func=new_old
#②執行函式decorator(func),由於函式decorator()裡面只定義了inner,且並未呼叫,因此,直接執行return inner。new_old=inner,將函式inner的記憶體位址賦值給了new_old
new_old() # ③執行new_old(),此時相當於執行inner(),由於inner中未定義引數func,程式會自動去上一級找該引數。而在第一步我們已經將最初的new_old賦給了func。所以本步驟執行new_old(),就相當於執行inner(),並且inner中func已確定。python中實現裝飾器可以採用這種格式
@deccorator
def new_old():
...這樣就代替了 new_old=decorator(new_old) 這段**。
如果要裝飾多個函式,且不同函式自身所需引數不同:
defdecorator(func):
def inner(*args):..
func(*args)
@decorator
defnew_old(a,b,c):
...@decorator
defold(a):
...@decorator
defnew():
...這樣執行每乙個函式,都會將裝飾器執行一遍。
對於附加新引數的裝飾器會稍微複雜一些:
defdecorator(s):
defoutter(func):
def inner(*args):
if s='ss'
: .
....
func()
elif s='aa'
: .....
func(*args)
return inner
return outter
@decorator('ss
') #此處相當於new_old=decorator('ss')(new_old),注意 decorator('aa') 其實就是outter。函式outter(new_old) return的是inner,因此new_old=inner
defnew_old(a,b,c):...
@decorator('aa
') defold(a,b,c):
...
如果想新增兩個引數,@decorator('ss',『yy』)
由於裝飾器是在程式執行前就將引數內化了的(閉包),@decorator(s,y),這種變數名傳引數的,必須在裝飾器之前定義。且傳遞入裝飾器內的引數值不隨變數後來的的改變而改變。
裝飾器 生成器
python生成器 迭代器 裝飾器 最簡單的生成器 g x x for x in range 10 for i in g print i函式方法實現稍複雜的生成器 def fib max n,a,b 0,1,1 while n在迴圈過程中不斷呼叫yield,就會不斷中斷,通常基本不用next 來呼叫...
PHLK 生成器 裝飾器
def printf nums for num in nums print num is d num yield num defadder nums for num in nums print adding d num if num 2 0 yield num 1else yield num 2nu...
裝飾器,生成器,迭代器
裝飾器 import time def show time func def inner x start time time.time func x end time time.time print end time start time return inner show time def add...