1. 程式人生 > >python裝飾器(補充完整)

python裝飾器(補充完整)

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函數。       

  

    有參數裝飾器:       示例:                        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‘)               #執行過程
      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__)

python裝飾器(補充完整)