python高階 裝飾器的理解

2021-10-06 17:22:26 字數 1180 閱讀 2671

裝飾器有很多的用處,裝飾器簡單的來說就是修改其他函式的功能的函式,比如想要在使用某個函式物件的時候列印日誌,但是我又不想在函式中列印**,這個時候就用到了裝飾器,而這個裝飾器其實就是閉包,想要使用裝飾器肯定是要先把閉包搞清楚。

閉包說好理解也挺好理解的,就是定義乙個函式,然後再這個函式中又定義了乙個內部函式,這樣內部函式就可以引用了外部函式中的定義的變數,並且當引用外部函式的時候他的返回值就是內部函式本身。那他這裡面的原理又是什麼呢?

一般情況下乙個普通的函式在使用結束後,函式的內部左右的東西都會被釋放掉,這樣記憶體就會被清理,但是閉包不同,如果在函式結束的時候在內部有函式會用到自己的臨時變數,那麼他就會把這個臨時變數繫結給內部函式,然後再釋放。

# 閉包

def external(b):

a = 10

def inside():

#在這裡引用了外部函式的變數

print(a+b)

#返回了內部函式的引用

return inside

if __name__ == "__main__":

demo = external(2)

demo() # 12

demo = external(6)

demo() # 16

上面這個就是簡單的閉包,有個部落格對這個解釋的很清楚「閉包詳解」

python為裝飾器提供了語法糖@,我們使用裝飾器的時候只需要把@放到函式前面就行了。舉個例子:

# 裝飾器

def external(b):

def inside():

print('這是裝飾器內部')

return b()

return inside

if __name__ == "__main__":

@external

def func():

return '這是正常的函式'

print(func())

#這是裝飾器內部

#這是正常的函式

上面這個例子,當引用func()的時候正常情況下是返回"這是正常函式",但是因為有裝飾器external的關係,引用了閉包的外部函式external,引數就是func函式本身,在閉包的內部函式inside引用了函式並且內部函式返回的是func函式的結果。整個流程下來就相當於執行了乙個加工後的函式。

python高階裝飾器 Python裝飾器高階

對帶引數的函式進行裝飾 對帶引數的函式進行裝飾,內嵌包裝函式的形參和返回值與原函式相同,裝飾函式返回內嵌包裝函式物件 def deco func def deco a,b print before myfunc called.ret func a,b print after myfunc calle...

python裝飾器理解 python裝飾器理解

裝飾器 在不改變原函式的 和呼叫方法的基礎上,給原函式增加額外的功能 理解宣告 為了方便理解,以下例子採用最簡潔的函式和新增的功能 給原函式新增乙個執行時間 import time def timer func def inner func return inner timer func timer...

python裝飾器 理解Python裝飾器

在python中,對於乙個函式,若想在其執行前後做點什麼,那麼裝飾器是再好不過的選擇,話不多說,上 usr bin env coding utf 8 script 01.py author howie from functools import wraps def decorator func wr...