Python閉包裝飾器

閉包

  • 閉包實現
    • 函數嵌套
    • 外函數里包裝一個內函數
    • 外函數作用域有一個局部數據對象
    • 內部函數對于外部函數作用域里非全局變量的引用
    • 外函數返回內部函數
def func_wai(a):
    def func_nei():
        print(a)
    return func_nei()

與遞歸有些類似,將尾遞歸中return,調用自己,更改為了內部函數

閉包的意義
  • 實現函數內部變量的延續(xù)

    每個函數運行都會開辟新的內存空間,在函數結束時,內部變量都將被釋放

    閉包則延續(xù)了局部變量的生命周期

  • 變量生命周期得到延續(xù),同時也增加了內存損耗

    def wai():
        p = list(range(1000))
        def nei():
            p[0] += 1
            print(p[0])
        return nei
     
    func = wai() # p 是一個保持狀態(tài)的變量
    #返回值載體 就相當于變量
    #當你不去釋放一個變量,會一直存活的
    
    
  • 變量私有化

    每一次閉包函數執(zhí)行后的返回值都是一個新的,這是因為函數運行首先開辟的都是一塊新的函數臨時空間 每一次閉包函數執(zhí)行后,都是返回了一個不一樣的閉包函數載體,那么這個載體里的變量,也是不一樣的


裝飾器

  • 裝飾器可以在函數運行前添加功能,并且不影響原有函數內容
    • 實際是將函數作為一個參數,帶入到另外一個函數用運行
# 簡單的裝飾器
def wai(func):
    def nei():
        res = func()
        return res + '你好'
    return nei

@wai
def work():
    return '123'
#------輸出---------
work()
  • 被裝飾函數帶參數

    def wai(func): #裝飾器
        def nei(var1,var2):
            var1 = 100  #在閉包函數內部對被裝飾函數參數進行干預
            var2 = 99
            return func(var1,var2)
        return nei
    
    @wai
    def work(a,b):
        return a + b
    
    res = work(20,30)  #wai(work)(a,b)
    print(res)
    
  • 裝飾器帶參數

    def A(*args):
        def B(func):
            def C(a,b):
                print('我是被裝飾函數的參數:',a,b)
                print('我是裝飾函數的參數:',*args)
                return func
            return C
        return B
    @A('ss')
    def func(a,b):
        pass
    
    func(1,2)
    ----------
    我是被裝飾函數的參數: 1 2
    我是裝飾函數的參數: ss
    
  • 過程分析

    def wai(b_func): #外函數的參數是一個函數對象
        def nei():
            print("嘿嘿嘿") #在nei函數里寫的代碼基本上都是添加的功能
            return b_func() #這個是nei函數返回值,用來返回之前在wai函數所接收的參數
            #b_func()
            #return ''
        return nei #返回了wai函數里的這個定義好的閉包容器
    
    @wai #語法糖
    def func():
        print('哈哈哈哈')
        return 'func'
    
    res = func() #調用一個被裝飾函數 其實相等于 wai(func)()
    print('func的返回值:',res)
    -------------------------------------
    #func() 傳統函數調用
        #1: print('哈哈哈')
        #2: return None
    #func() 被裝飾時調用 @wai
        #被裝飾函數: func
        #裝飾器函數: wai
        #1: wai(func) -> return nei
        #2: nei() ->
            #1: print("嘿嘿嘿")
            #2: return b_func()
                #1: b_func() -> 'func'  #內部調用被裝飾函數
                #2: return 'func' #內部閉包函數的返回值 其實是被裝飾函數的返回值
    
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 閉包和裝飾器 1.8 閉包和裝飾器 學習目標 1. 能夠說出閉包的定義形式 2. 能夠說出裝飾器的實現形式 ...
    Cestine閱讀 594評論 0 0
  • 閉包 內部函數調用外部函數的變量(一個閉包就是你調用的一個函數A,這個函數A返回一個函數B給你。這個返回的函數B就...
    等哈光圈閱讀 244評論 0 0
  • 包(lib)、模塊(module) 在Python中,存在包和模塊兩個常見概念。 模塊:編寫Python代碼的py...
    清清子衿木子水心閱讀 3,906評論 0 27
  • 最近在做個人簡歷,現在想的是做個人網站(靜態(tài)頁面)。 嗚嗚嗚動手太少,做起來簡直心累。而且目前還沒考慮瀏覽器的兼容...
    南鄰有嘉樹閱讀 346評論 0 1
  • 命令模式:把方法調用封裝。 命令模式將“請求”封裝成對象,以便使用不同的請求,隊列或者日志來參數化其它對象,命令模...
    jack_520閱讀 587評論 0 0

友情鏈接更多精彩內容