def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper @log # 相当于 now = log(now) def now(): print('2017-8-6')
f = now()
print(now.__name__)
1. python 解释器 发现@log 去调用log 函数;
2. 执行log 前,需要一个func参数,这个参数就是@log下面修饰的函数: now()
即 @log: ---> func = now() 即:闭包wrapper持有了自由变量now()
---> now = log(now) =>return wrapper(*args,*kw)
即:now 已经指向了wrapper(*args,*kw)
3. f = now(): -->连同func = now() 一起, 调用wrapper(*args,*kw),
4. wrapper 执行print语句,获取func变量的value:now()
5. 执行return 返回 now() 函数的内容
6. 最后打印now的名字,发现now 的名字为wrapper
------2018.1.11update 什么鬼,自己都看不明白 傻了吧
closure 闭包
调用函数A,返回了函数B,这个函数B就是闭包
调用函数A时,传递的参数,就是自由变量
函数A调用结束后,自由变量并不会被回收,仍由闭包B持有
---然而函数A 调用完毕后,即被释放,比类占用的资源少(类要在程序执行完毕后才释放资源)
是由函数 及 其 自由变量相关的外部环境一起构成的实例
不同的自由变量 和 相同的函数 组成了 不同的 实例
闭包是由函数和与其相关的引用环境组合而成的实例
1 ''' 2 打印各种动物叫声,用闭包实现 3 ''' 4 5 # animal : 自由变量 6 def animalVoice(animal): 7 # animal_voice: 函数 8 def animal_voice(voice): 9 print('aminal:',animal,'voice:',voice) 10 return animal_voic 11 12 dog = animalVoice('dog') 13 dog('wangwang') 14 15 cat = animalVoice('cat') 16 cat('miaomiao')
encapsulation 封装
enclose (something) in or as if in a capsule.
将某物包裹在封闭的空间,或仿佛在封闭的空间
学自:https://segmentfault.com/a/1190000004461404