流畅的python 第7章:函数装饰器和闭包

1. 装饰器基础


  装饰器是可调用的对象,其参数是被装饰的函数.

>>> def deco(func):
	def inner():
		print('running inner()')
	return inner

>>> @deco
def target():
	print('running inner()')

	
>>> target()
running inner()
>>> deco(target)
.inner at 0x01147BB8>
>>> deco(target)()
running inner()
>>> 

2. 变量作用域

如果给全局变量赋值,必须在函数内用global声明.

>>> b=6
>>> def f2(a):
	print(a)
	print(b)
	b = 9

	
>>> f2(3)
3
Traceback (most recent call last):
  File "", line 1, in 
    f2(3)
  File "", line 3, in f2
    print(b)
UnboundLocalError: local variable 'b' referenced before assignment
>>> def f2(a):
	global b
	print(a)
	print(b)
	b=9

	
>>> f2(3)
3
6
>>> 

3. 闭包

内部函数可以看作是一个闭包。闭包是一个可以由另一个函数动态生成的函数,并且可以改变和存储函数外创建的变量的值。

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

>>> avg = make_averager()
>>> avg(10)
10.0
>>> avg.series

4. nonlocal关键字

nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量,

闭包中的内部函数想修改外部变量时需要使用nonlocal.

 

>>> def make_averager():
	count = 0
	total = 0
	def averager(new_value):
		nonlocal count,total
		count +=1
		total +=new_value
		return total /count
	return averager

>>> 

5.标准库中的装饰器

python内置了三个用于装饰方法的函数: property 、 classmethod 和 staticmethod ,

这些是用来丰富类的,Python内置的@property装饰器就是负责把一个方法变成属性调用的。

>>> class Test(object):
	@property
	def age(self):
		return 12

	
>>> t = Test()
>>> t.age
12


你可能感兴趣的:(流畅的Python笔记)