Python 裝飾器(讀書筆記,流暢的Python)

裝飾器基本知識

  1. 裝飾器是一個可調用對象,參數是另一個函數(被裝飾的函數)。裝飾器,會將原來的函數,處理後返回(原則上兩者,本質不同)。這是裝飾器的一個特性。
# decorate是一個裝飾器
# 被裝飾後,獲得target,一個新的函數(可調用對象)
@decorate
def original():
	print('hello world')

# 上述代碼等價於
target = decorate(original)
  1. 嚴格來說,裝飾器,之一語法糖
  2. 裝飾器的另一個特性,裝飾器在加載模塊時立即執行。(導入這一函數時)
  3. 裝飾器,在真實代碼中的常用使用方式:裝飾器通常在一個模塊中定義,另一個模塊中使用;大多數裝飾器會在內部定義一個函數,然後將其返回(當然,也可以不定義,只需返回的是一個可調用對象,否則的話裝飾器或許就沒有用了)

閉包(某種意義上來說,就是一個封閉的環境,類似於一個模塊)

  1. 對於函數make_averager,變量是個內部變量,series
  2. 對於函數averager,變量series是個 “全局變量”,這個全局變量只是相對於make_averager內部而言的。也就是所謂的閉包
  3. 但是,變量series,是不可變類型數據時,是無法在函數averager中直接使用。
  4. 這就引入了關鍵字nonlocal,類似於global的作用
  5. 可以使用,python 的__code__屬性(表示編譯後函數定義體)查看函數局部變量和自由變量的名稱
  6. avg.code.co_freevars(自由變量),avg.code.co_varnames(局部變量)
def make_averager(): 
	series = []
	def averager(new_value): series.append(new_value) 
		total = sum(series) 
		return total/len(series)
	return averager

def make_averager(): 
	series = []
	def averager(new_value): series.append(new_value) 
	    nonlocal count, total
		total = sum(series) 
		return total/len(series)
	return averager

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