python 中 "@" 裝飾器 的作用 與 理解

  1. 首先要知道“@”這個符號-裝飾器,就是個語法糖,主要的作用就是“安全”。使用python裝飾器的好處就是在不用更改原函數的代碼前提下給函數增加新的功能

  2. 就是裝飾器的作用,首先介紹下裝飾器
    裝飾器就是,假如已經有了一個函數func(a,b),作用是返回a-b,但是現在要讓它返回a-b的絕對值,就要增加一個功能,如果不使用“@”這個符號的作用的話應該如下這麼寫:

    def decorate(func):
    	def inner(a, b):
       	 ret = func(a, b):
       	 return abs(ret)
      return inner
    
    def sub(a, b):
     return a-b
    
    >>>sub(3, 4)
    >>> -1
    >>>sub = decorate(sub)
    >>>sub(3, 4)
    >>> 1
    

    看上面那個例子所示,這樣的話就要重新創建一個新的函數來包含sub這個函數的功能,如果這樣的函數一(即需要增加功能的函數很多),那麼會大大影響機器的功效,和代碼的美觀。

    但是如果使用“@”符號的話,那麼代碼如下:

    def decorate(func):
    	def inner(a, b):
        	ret = func(a, b):
        	return abs(ret)
    	return inner
    
    @decorate
    def sub(a, b):
    	return a-b
    
    >>>sub(3, 4)
    >>>1
    

    如上面的結果所示現在調用的是sub函數不是上個例子的調用decorate函數

  3. 而且裝飾器能同時添加多個功能(比如說多個函數需要添加不同的模塊,這個時候就需要將某個功能分到不同的函數中),就不用上面的例子了因爲多個裝飾器就涉及到了執行順序的問題,具體如下:
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

    總代碼如上,因爲屏幕問題不能一下子都輸出來,結果如下:
    在這裏插入圖片描述
    有沒有發現這個順序是非常有趣的,多個裝飾器執行的順序就是從最後一個裝飾器開始,執行到第一個裝飾器,再執行函數本身

    裝飾器的外函數和內函數之間的語句是沒有裝飾到目標函數上的,而是在裝載裝飾器時的附加操作。
    23~25行是裝載裝飾器的過程,相當於執行了test=dect1(dect2(test)),此時先執行dect2(test),結果是輸出aaaa、將func指向函數test、並返回函數two,然後執行dect1(two),結果是輸出1111、將func指向函數two、並返回函數one,然後進行賦值。

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