日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python装饰器使用多吗_如何理解Python装饰器?

發布時間:2025/3/15 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python装饰器使用多吗_如何理解Python装饰器? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python中的裝飾器是通過利用了函數特性的閉包實現的,所以在講裝飾器之前,我們需要先了解函數特性,以及閉包是怎么利用了函數特性的

① 函數特性

python中的函數特性總的來說有以下四點:

1. 函數作為變量傳遞

def add(x):

return x + 1

a = add # 作為變量

說明:函數如果不加括號,是不會執行的,代表的是一個函數對象,它是可以作為變量來傳遞

2.函數作為參數傳遞

def add(x):

return x + 1

def execute(f):

return f(3)

execute(add) # 作為參數

說明:一個函數可以接受另一個函數對象作為自己的參數,并對函數對象進行處理

3.函數作為返回值

def add(x):

return x + 1

def get_add():

return add # 作為返回值

說明:一個函數的返回值可以是另一個函數對象

4.函數嵌套及跨域訪問

def outer():

x = 1

def inner():

print(x) # 被嵌套函數inner內部的x變量可以到封裝域去獲取

inner()

outer()

說明:一個函數(主函數)內部是可以嵌套另一個函數(子函數)的,比如outer函數從內部嵌套了inner。一個函數本地域沒有的變量,是可以跨到它的封裝域(主函數與子函數之間的范圍)去尋找的

② 閉包的實現

python中的裝飾器是通過閉包實現的,簡單地講,閉包就是引用了外部變量的內部函數,而閉包的實現正是利用了以上函數特性,下面我們來看看閉包是如何實現的:

def outer(x):

def inner(): # 函數嵌套

return x # 跨域訪問,引用了外部變量x

return inner # 函數作為返回值

closure = outer('外部變量') # 函數作為變量賦給closure

print(closure()) # 執行閉包

執行結果:

外部變量

說明:我們分析下這個流程,outer接收到'外部變量',傳給inner,作為它return的參數,最后outer返回inner函數,返回的inner函數作為變量傳遞給closure,最后執行closure這個函數對象,實際上是執行了inner這個函數,返回了 '外部變量',這樣就實現了一個簡單的閉包

我們發現上面的閉包例子只用到了之前說的其中3個函數特性,函數作為參數 這個特性好像并沒用上,別急,我們一步步來,試想一下,outer的參數x是不是也可以是一個函數對象?

下面我們來改寫一下實現閉包的代碼:

def func():

return '函數func'

def outer(x):

def inner(): # 函數嵌套

return '戴了inner牌帽子的 ' + x() # 跨域訪問,引用了外部變量x

return inner # 函數作為返回值

closure = outer(func) # 函數func作為outer的參數;函數作為變量賦給closure

print(func()) # 執行原始函數

print(closure()) # 執行閉包

執行結果:

函數func

戴了inner牌帽子的 函數func

說明:我們看到打印的結果, 從 func() 到 closure(),我們是不是感覺函數func被裝飾了一番,變成了closure,具體是怎么裝飾的呢?

劃重點來了!!!!!!!!!!!

我們看到closure實際上是outer(func),func作為參數傳進outer,outer的子函數inner對func返回的結果進行了一番裝飾,返回了一個裝飾后的結果,最后outer返回inner,可以說inner就是裝飾后的func,這就是一個函數被裝飾的過程,重點在于執行 outer(func) 這個步驟

③ 裝飾器語法糖 @

python給我們提供了語法糖 @,我們想執行 outer(func) 的時候,只需要把outer函數@到func函數的上面就可以了

具體實現如下:

def outer(x):

def inner():

return '戴了inner牌帽子的 ' + x()

return inner

@outer

def func():

return '函數func'

print(func())

執行結果:

戴了inner牌帽子的 函數func

說明:我們看到打印的結果跟我們執行closure()的結果是一樣的,也就說明 加了outer裝飾器的func 等價于 outer(func),所以我們很清楚地知道裝飾器@的作用是什么了,就是拿來把被裝飾的函數作為參數傳遞到裝飾器函數里面加工的,最后執行被裝飾函數的時候,就相當于執行了一個加工后的函數。

以上就是python中裝飾器的誕全生過程......ChrisYZX:Python裝飾器的誕生過程?zhuanlan.zhihu.com

總結

以上是生活随笔為你收集整理的python装饰器使用多吗_如何理解Python装饰器?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。