歡迎您光臨本站 註冊首頁

Python閉包裝飾器使用方法彙總

←手機掃碼閱讀     retouched @ 2020-06-30 , reply:0

閉包內容:
 

匿名函數:能夠完成簡單的功能,傳遞這個函數的引用,只有功能

普通函數:能夠完成複雜的功能,傳遞這個函數的引用,只有功能

閉包:能夠完成較為複雜的功能,傳遞這個閉包中的函數以及數據,因此傳遞是功能+數據

對象:能夠完成最複雜的功能,傳遞很多數據+很多功能,因此傳遞的是數據+功能

―――――――――――――――――――

對全局函數進行修改:在函數當中加global,在閉包中外邊中的變量加nonlocal

閉包定義:有兩個函數嵌套使用,裡面的函數可以使用外面函數所傳輸的參數,最後可傳遞的是裡面函數的結構與數據(個人理解)。

最後閉包可以在python中引申出裝飾器 ―――――――――――――――――――

  def closure():    # 在函數內部再定義一個函數,    # 並且這個函數用到了外邊函數的變量,那麼將這個函數以及用到的一些變量稱之為閉包    def closure_in(x):      print('---------我是打不死的%s--------' %x)    return closure_in    x = closure()  x('小強')    print('*'*20)  # -----加餐---------  def closure_1(a,b,c):    def closure_on(x):      print('-----%s加餐-------' %b)      print(a*x + c)    return closure_on    demo = closure_1(2,'小強',3) #傳closure_1函數  demo(4) #傳clsure_on函數    #注:函數不加括號,調用的是函數本身【function】;函數加括號,調用的是函數的return結果。

 

裝飾器內容:
 

代碼要遵守‘開放封閉'原則;對已經寫好的函數遵守封閉,對功能擴展遵守開放;

  # 裝飾器的作用:為了對原來的代碼上進行擴展  def decoration(func):    def call_func():      print('-------正在裝飾 -------' )      func()    return call_func    #@decoration   #--->demo_new = decoration(demo)  def demo():    print('demo----')    demo_new = decoration(demo)  demo_new()

 

使用裝飾器來測試一個函數的運行時:

  import time  def set_func(func):    def call_func():      start_time = time.time()      func()      stop_func = time.time()      print(‘alltimes is %f' %(stop_func-start_fun))    return call_func  @set_func  def test1():    print(‘――-test1―――')  test1()    #等價於:  @set_func==test1 = set_func(test1)

 

1. 沒有參數,沒有返回值的函數進行裝飾:
 

  def set_func(func):    def call_func():      print(‘―――test2――-')      print(‘―――-test3――')      func()    return call_func    @set_func  def test1():    print(‘――test1――-  ')

 

2. 對有參數無返回值的函數進行裝飾:
 

  def set_func(func):    def call_func(a): #變      print(‘―――test2――-')      print(‘―――-test3――')      func(a) #變    return call_func    @set_func  def test1(num):    print(‘――test1――- %d  ' %num)    test1(100) ―->call_func(100)  test1(200)――>call_func(200)

 

復現裝飾器原理:

――――――――――――――――――――――――-

只要遇到@函數 裝飾器(這句話),在程序中就已經執行了!!
 

3. 不定長參數的函數裝飾:
 

  def set_func(func):    def call_func(*args,**kwargs): #變      print(‘―――test2――-')      print(‘―――-test3――')      func(*args,**kwargs) #(拆包)將元祖拆開,每個進行傳輸;      #func(args,kwargs)―>不行,相當於傳遞了兩個參數:一個元祖,一個字典。    return call_func  @set_func  def test1(num,*args,**kwargs):    print(‘――test1――- %d  ' %num)    print(‘――test1――-  ' , args)    print(‘――test1――- ' ,kwargs )  test1(100)  test1(100,200)  test1(100,200,300,mm=100)

 

注意:*args保存不定長參數,以元祖保存,**kwargs保存字典形式(mm=...)

4.對應的返回值參數進行裝飾、通用裝飾器:
 

  #通用裝飾器  def set_func(func):    print(“開始進行裝飾―――-”)    def call_func(*args,**kwargs): #變      print(‘―――test2――-')      print(‘―――-test3――')      return func(*args,**kwargs) #(拆包)將元祖拆開,每個進行傳輸;如果沒有return ret返回none。      #func(args,kwargs)―>不行,相當於傳遞了兩個參數:一個元祖,一個字典。    return call_func    @set_func  def test1(num,*args,**kwargs):    print(‘――test1――- %d  ' %num)    print(‘――test1――-  ' , args)    print(‘――test1――- ' ,kwargs )    return ‘ok'  #―-返回給上面的func(),然後return func―ret  ret = test1(100)

 

5. 多個裝飾器對同一個函數進行裝飾:
 

  def add_qx(func):    print(“――開始進行裝飾權限1―――-”)    def call_func(*args,**kwargs): #變      print(‘這是權限驗證1')      return func(*args,**kwargs)    return call_func      def add_xx(func):    print(“――開始進行裝飾xx功能―――-”)    def call_func(*args,**kwargs): #變      print(‘這是xx權限驗證')      return func(*args,**kwargs)    return call_func  @add_qx  @add_xx  def test1():    print(‘――test1――-')  test1()

 

首先執行第一個,但是第一個裝飾器下面不是函數(裝飾器原則:下面必須是函數,否則不執行),所以第一個函數先等待,等第二個裝飾器執行後形成函數在交給第一個裝飾器;所以運行結果是:

開始進行裝飾xx的功能,

開始進行裝飾權限1,

這是權限驗證1,

這是xx權限驗證,

――-test1――-,

――――――裝飾器練習―――――- 輸出格式:

haha


  def set_func_1(func):    def call_func():      return ‘' + func() + ''    return call_func      def set_func_2(func):    def call_func():      return ‘' + func() + ''    return call_func    @set_func_1()  @set_func_2()  def get_str():    return ‘haha'    print(get_str())  最後執行的效果:haha

 

6. 用類對函數進行裝飾(瞭解):
 

  class Test(object):    def __init__(self,func):      self.func = fun      def __call__(self):      print(‘這裡是裝飾器的功能。。。。')      return self.func()    @Test  def get_str():    return ‘haha'    print(get_str())

 

以上就是裝飾器與閉包的全部內容

                                                       

   


[retouched ] Python閉包裝飾器使用方法彙總已經有254次圍觀

http://coctec.com/docs/python/shhow-post-240389.html