python 的内置函数,闭包,以及装饰器
内置函数
首先明确一个观点,python 中一切皆为对象,包括函数,下面可以看一下函数对象的数据结构:
可以看到,函数对象包含成员变量,代码块,闭包信息,字典等等成员。
print1.a = 10
和普通对象一样可以添加成员变量。
下面是几行简单的代码,涉及内置函数以及闭包:
def outer(x, y):
def inner():
print x, y # 1
return inner
print1 = outer(1,2)
print2 = outer(2,3)
print1.a = 10
print1()
print2()
outter 函数返回了函数内部的 inner 函数对象,调试代码如下:
发现两个 print 指向两个不同的 inner 方法对象,为什么?可以这么理解,在函数 outter 运行的过程中,inner 函数对象才被 new 出来,返回给 print1 和 print2。在运行时生成了两个不同的对象。
闭包
每个函数作用域对象都包含一个闭包字段,用以封存上下文,
这里就是封存了 x,y 两个变量。
装饰器
装饰器起源于设计模式:装饰模式,常用于 log 之类的场景。在 python 中装饰器其实就是一个闭包。
def outer(some_func):
def inner():
print "before some_func"
ret = some_func() # 1
return ret + 1
return inner
def foo():
return 1
decorated = outer(foo) # 2
decorated()
before some_func
2
将需要被装饰的方法塞入装饰器方法,return 得到一个被装饰的方法,则再次运行的时候已经包含了更多的逻辑。
再加上 @ 语法糖,类似 java 的注解,但是比注解强大多了,python 的装饰器可以直接形成函数调用的切面,而注解仅仅只是在函数上附带一些信息而已,需要开发者反射分析并且实现调用逻辑。