Python裝飾器--從閉包到裝飾器

函數調用與函數自身

在學習裝飾器之前我們首先要回顧一下函數與函數調用,這對接下來理解代碼很有幫助。

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的調用

請仔細分析代碼,並且自己動手敲幾個實例


記得點贊,收藏+分享~~

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