裝飾器 生成器

2022-04-03 03:42:20 字數 1782 閱讀 3829

裝飾器主要用於程式功能的一些擴充套件。

由於在python中,函式名(不帶括號)也是一種變數名,可以像賦值一樣給另外乙個變數。這就導致了裝飾器這種玩法。

其實函式名就是儲存著函式的位址,因此,可以把這個位址賦值給另外乙個變數,與c語言中的指標基本一樣,同時與python列表的引用也是相像的。

不附加新引數的裝飾器比較簡單

def

decorator(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) 這段**。

如果要裝飾多個函式,且不同函式自身所需引數不同:

def

decorator(func):

def inner(*args):..

func(*args)

@decorator

defnew_old(a,b,c):

...@decorator

defold(a):

...@decorator

defnew():

...這樣執行每乙個函式,都會將裝飾器執行一遍。

對於附加新引數的裝飾器會稍微複雜一些: 

def

decorator(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...