函數調用與函數自身
在學習裝飾器之前我們首先要回顧一下函數與函數調用,這對接下來理解代碼很有幫助。
def fun1():
pass
print(fun1()) #這裏是函數調用,返回結果爲None
#>> None
print(fun1) #這裏是函數自身
#>> <function fun at 0x000001EE0E977C10>
也許你已經非常瞭解函數調用和函數自身的區別了,但是請你耐心的往下看
def fun1():
def fun2():
pass
return fun2
print(fun1()) #結合下面的結果再次分享代碼,很重要
#>> <function fun1 at 0x0000020A6D978C10>
print(fun1()()) #如果你不知道爲什麼這麼寫請認真分析這段代碼
#>> None
上面的代碼可以幫助你很好的理解裝飾器。
瞭解裝飾器
裝飾器的作用: 可以在不改變原函數的基礎上,給函數增加功能。
裝飾器實際上就是返回函數的函數,將一個函數當做參數,返回一個替代版的函數。
裝飾器會在函數聲明時調用,記住這句話
裝飾器的語法
接下來我們看一下裝飾器如何去定義,以及如何使用
def deco(fun): #參數接收函數,這個參數接收的是fun1函數
def deco_fun(n): #這個參數是接收參數用的
if n == 10:
return fun(n)
#增加了一個功能,判斷參數的值,當滿足要求時纔會調用該方法
else:
pass
return deco_fun #注意這裏返回的是函數不是函數調用的結果
#也許你不理解爲什麼這裏要定義兩個函數,回想一下裝飾器在什麼時候調用?
#deco函數中並沒有調用函數,而是返回了一個函數,不是函數的調用
@deco
def fun1(n):
return '查看返回值'
print(fun1(10))
#>> 查看返回結果
print(fun)
#>> <function deco.<locals>.deco_fun at 0x000001A871CC7DC0>
#這個函數對象表示的是deco內部的deco_fun函數
#結合上面的註釋和代碼,你應該可以想到fun1實際上調用的是deco_fun方法同時參數10也給了deco_fun
#實際上deco_fun方法內的返回值纔是對fun的調用
請仔細分析代碼,並且自己動手敲幾個實例
記得點贊,收藏+分享~~