python閉包與裝飾器--上篇

函數有三種形式

1.定義形式
2.對象形式(函數變量)
3.調用形式

def outer():
    str1 = "我是outer函數str1"
    print(str1)
    def inner():
        str1 = "我是inner函數str1"
        print(str1)
    return inner
f=outer()
f()
#結果:
#我是outer函數str1
#我是inner函數str1

在這裏插入圖片描述

函數嵌套

函數的嵌套即在函數內部定義其他的函數。

def outer():
    str1 = "我是outer函數str1"
    print(str1)
    def inner():#此處定義的函數即爲函數嵌套
        str1 = "我是inner函數str1"
        print(str1)
    return inner

閉包

閉包:內部函數對其外部函數環境的引用。
條件一:函數要嵌套即存在內部函數和外部函數
條件二:內部函數使用其外函數的環境(即使用外部函數的變量)
條件三:內部函數在外部函數的外部使用。

閉包圖示

對於C語言來說若外部函數結束則其內部的一切都結束並被釋放,閉包即是python特有的區別去C語言的特性,若外部函數outer返回內部函數inner,且內部函數inner使用了外部函數outer的變量,則該內部函數inner和外部函數的變量str1並不會被釋放而是依舊在inner中可以被使用。

裝飾器

前提:裝飾器是在閉包的基礎上建立的。
1.裝飾器本質上是一個python函數(一個返回函數的函數),它可讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數對象(閉包即如此)。
2.裝飾器經常用於有切面需求的場景,比如:插入日誌、性能測試、事務處理、緩存、權限校驗等場景。即爲已經存在的函數或對象添加額外的功能。
3.裝飾器:一個閉包,把一個函數當做參數返回一個替代的函數。

裝飾器函數步驟:
1.寫外部函數,傳入被修飾函數(即已有的函數或功能)
2.返回修飾後的內部函數
3.添加修飾動作(實現增加的功能),以及對被裝飾函數的處理
整體可以這樣理解:其實就是把被修飾函數穿了衣服變成了此處的內部函數inner

#舉例:爲已有函數增加打印日誌時函數名輸出功能
#已有函數
def hello():
    print ("hello world!")
#第一步:傳入被修飾函數
def outer(func):#func將爲被修飾函數hello
    def inner():
        return func()#內部函數返回的是執行hello函數
    pass
#第二步:返回內部修飾後的內部函數
def outer(func):#func將爲被修飾函數
    def inner():
        return func()#內部函數返回的是執行hello函數
    return inner
#第三步
def outer(func):#func將爲被修飾函數
    def inner():
        print("[DEBUG]: enter {}()".format(func.__name__))
        return func()#內部函數返回的是執行hello函數
    return inner
#閉包
hello=outer(hello)
hello()
#裝飾器
@outer
def hello():
    print ("hello world!")
hello()

這就是裝飾器實質即閉包
裝飾器用法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章