疊加裝飾器:在同一個被裝飾對象中,添加多個裝飾器,並執行(裝飾器在被裝飾對象被調用時,纔會執行添加的功能)閉包
疊加裝飾器:app
裝飾順序:由下而上,調用wrapper裝飾器拿到返回值inner函數
執行順序:由上而下,調用裝飾事後的返回值innercode
ps:不管inner中出現任何判斷,最後都要返回‘調用後的被裝飾對象’func(*args,**kwargs)對象
有參也可叫作三層閉包,裝飾器後面加上括號傳入參數(能夠用做用戶權限區分)索引
裝飾在被裝飾對象時,沒有傳入參數的裝飾器內存
做用:修復的是被裝飾對象的空間it
from functools import wraps def wrapper(func): @wraps(func) # 修更名稱空間: inner ---》 func def inner(*args, **kwargs): ''' 此處是裝飾器的註釋 :param func: :return: ''' res = func(*args, **kwargs) return res return inner # ---》 func @wrapper def index(): ''' 此處是index函數的註釋 :return: ''' pass # print(index) # 函數對象 # # # 函數對象.__doc__: 查看函數內部的註釋 index() print(index.__doc__) # inner.__doc__
原理:內置--iter--都是可迭代對象,加上next取值就是迭代器,迭代器不依賴索引取值,每次只取一個值而且停頓,內存裏面只存一個值,若是想要獲取前面的值,只能重新執行iter;class
優勢:不依賴索引取值,佔用內存小
缺點:一次只取一個值,要想調用前面的值,只能重新建立迭代對象或者重新調用iter,當兩個循環同時使用一個迭代器時,只有一個能執行成功