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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章