装饰器 decorator

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

posted @ 2017-08-07 17:08  vivi~  阅读(128)  评论(0编辑  收藏  举报