首先闭包是一个集合的概念,即自由变量和闭包函数,闭包函数其实就是内嵌函数,
下面我们用一个经典装饰器案例来分析闭包,这是一个日志装饰器的函数,在日志函数中可以
给一个参数来定日志级别,
log 函数实现带参数的装饰器
dec函数接收func为参数
wrapper函数的参数就全部传给func作为参数
其实就是log日志函数 + 装饰函数 + 包装函数 + 真实运行的函数
一般的装饰器是 装饰函数 + 包装函数 + 真实运行的函数
__closure__可以用来存放闭包相关的变量和函数的
def log(level="low"):
#print hex(id(level))
x = 10
y = 100
def dec(func):
z = -99
print x #dec 函数就引入了对x的闭包
def wrapper(*kargc,**kwargs):
print "in wrapper..."
print "level is ",level #wrapper函数就引入对level的闭包
return func(*kargc,**kwargs) #wrapper函数引入对func的闭包
#clo = wrapper.func_closure
#ifclo:
# print "vars:",[str(c)for c in clo]
print "wrapper.__closure__...",wrapper.__closure__
print "id(wrapper): %X" % id(wrapper)
return wrapper
#print hex(id(dec))
#print "dec vars,",dec.__closure__[0].cell_contents
print "dec.__closure__...",dec.__closure__
print "id(dec):%X" % id(dec)
return dec
def funca():
print "func...."
print "id(funca) is ",hex(id(funca))
f =(log('xxx')(funca)) #f指向了wrapper函数
print "id(f) is ", hex(id(f))
#id(wrapper): 24F8430
#id(f) is 0x24f8430
print "*"*200
f()
上述程序输出的结果为
id(funca) is 0x24f8930
dec.__closure__... (<cell at0x02500090: str object at 0x02544548>, <cell at 0x02500190: int object at0x0202B2BC>)
id(dec): 24F8870
10
wrapper.__closure__... (<cell at0x025001B0: function object at 0x024F8930>, <cell at 0x02500090: strobject at 0x02544548>)
id(wrapper): 24F8430
id(f) is 0x24f8430
********************************************************************************************************************************************************************************************************
in wrapper...
level is xxx
func....
参考系列
https://serholiu.com/python-closures
http://www.cnblogs.com/ChrisChen3121/p/3208119.html