python裝飾器(補充完整)
阿新 • • 發佈:2018-04-23
pri pan 代碼 != 進行 賦值 bsp none turn 一、什麽是裝飾器
1、對現有已經實現功能的代碼進行擴展。
2、不用修改被撞時對象的源代碼和調用方法
二、裝飾器的使用
無參數裝飾器:
示例:
def zsq(func): def yz(args): print("驗證") return func(args) return yz @zsq def hs(name): print("我是一個函數%s"%name) return "hs fanhuizhi" ceshi = hs("wz") print(ceshi) 執行過程:
1、將zsq加載到內存中。
2、碰到@zsq,會執行zsq函數將@zaq下的函數當作參數傳入zsq中(相當於zsq(hs))。
3、此時func形參等於hs函數,讀取yz函數到內存,return yz函數的內存地址到hs函數(@zsq就相當於(hs = zsq(hs)))。
4、此時執行ceshi = hs(“wz”),由於hs被return 回來的yz函數覆蓋,這裏執行的就相當於ceshi = yz(“wz”)。
5、執行yz函數,首先print(“驗證”),然後return func(args),這句return func(args)的意思是執行func函數並把函數的返回值返回給調用yz函數的對象,而調用yz函數的為ceshi = hs(“wz”),所以這一步就是把返回值傳給hs(“wz”)並賦值給ceshi變量。
6、在這裏執行func(args)由於第三步的時候func等於hs函數所以就相當於執行hs函數。
1、解釋器從上往下解釋python代碼首先將hs1函數加載到內存,然後把hs2和zsq函數也加在到內存。
2、碰到@zsq(hs1, hs2),解釋器首先會執行zsq(hs1, hs2),把hs1和hs2當作參數傳給zsq賦值給zsq的形參hs_1和hs_2(這裏相當於@zsq = zsq(hs1,hs2))。
3、將home函數加載到內存並return給@zsq。
4、執行裝飾器將index函數當作值傳給zsq函數,由於@zsq已被home函數覆蓋這時候相當於執行index = home(index)。
5、讀取panduan函數到內存中並把panduan函數的內存地址返回給調用home函數的index中。
6、執行index(‘w’,’z’),由於index被panduan覆蓋這裏就相當於執行panduan(‘w’,’z’)。
7、執行panduan函數中的代碼(不再贅述…)
三、裝飾器語法:
被裝飾函數的正上方,單獨一行
@deco1
@deco2
@deco3
def foo():
pass
foo=deco1(deco2(deco3(foo)))
四、裝飾器補充:wraps
from functools import wraps
def deco(func):
@wraps(func) #加在最內層函數正上方
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper
@deco
def index():
‘‘‘哈哈哈哈‘‘‘
print(‘from index‘)
print(index.__doc__)
def zsq(func): def yz(args): print("驗證") return func(args) return yz @zsq def hs(name): print("我是一個函數%s"%name) return "hs fanhuizhi" ceshi = hs("wz") print(ceshi) 執行過程:
有參數裝飾器: 示例: def hs1(canshu1, canshu2): print("第一個函數") def hs2(canshu1, canshu2): print("第二個函數") def zsq(hs_1, hs_2): def home(home_func): def panduan(pd1, pd2): hs1_return = hs_1(pd1, pd2) if (hs1_return != None): return hs1_return home_return = home_func(pd1, pd2) if (home_return != None): return home_return hs2_return = hs_2(pd1, pd2) if (hs2_return != None): return hs2_return return panduan return home @zsq(hs1, hs2) def index(canshu1, canshu2): print("index") index(‘w‘,‘z‘) #執行過程
python裝飾器(補充完整)