Python with 工作原理、装饰器、回收机制、内存管理机制、拷贝、作用域等( 八 )


内函数中修改外函数的值
一般在函数结束时 , 会释放临时变量 , 但在闭包中 , 由于外函数的临时变量在内函数中用到 , 此时外函数会把临时变量与内函数绑定到一起 , 这样虽然外函数结束了 , 但调用内函数时依旧能够使用临时变量 , 即闭包外层的参数可以在内存中进行保留
如果想要在内函数中修改外函数的值 , 需要使用关键字声明变量
下面用伪代码进行闭包格式的描述def 外层函数(参数):def 内层函数():print("内层函数执行", 参数)return 内层函数内层函数的引用 = 外层函数("传入参数")内层函数的引用()
接下我们对闭包的测试展开如下:
def outer():list = []def inner(value):list.append(value)return listreturn innerinner = outer()list_temp = inner(1)list_temp = inner(2)list_temp = inner(3)print(list_temp) # [1, 2, 3]
def outer():list = []def inner(value):list.append(value)return listreturn innerlist_temp = outer()(1)list_temp = outer()(2)list_temp = outer()(3)print(list_temp) # [3]
08、装饰器的介绍
博客推荐地址:装饰器
什么是装饰器()
简单来说 , 可以把装饰器理解为一个包装函数的函数 , 它一般将传入的函数或者是类做一定的处理 , 返回修改之后的对象 。所以 , 我们能够在不修改原函数的基础上 , 在执行原函数前后执行别的代码 , 比较常用的场景有日志插入 , 事务处理等 。
装饰器就是用于拓展原来函数功能的一种函数 , 这个函数的特殊之处在于它的返回值也是一个函数 , 使用装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能 。

Python with 工作原理、装饰器、回收机制、内存管理机制、拷贝、作用域等

文章插图
软件的设计应该遵循开放封闭原则 , 即对扩展是开放的 , 而对修改是封闭的 。对扩展开放 , 意味着有新的需求或变化时 , 可以对现有代码进行扩展 , 以适应新的情况 。对修改封闭 , 意味着对象一旦设计完成 , 就可以独立完成其工作 , 而不要对其进行修改 。
软件包含的所有功能的源代码以及调用方式 , 都应该避免修改 , 否则一旦改错 , 则极有可能产生连锁反应 , 最终导致程序崩溃 , 而对于上线后的软件 , 新需求或者变化又层出不穷 , 我们必须为程序提供扩展的可能性 , 这就用到了装饰器 。
函数装饰器分为:无参装饰器和有参装饰两种 , 二者的实现原理一样 , 都是’函数嵌套+闭包+函数对象’的组合使用的产物 。
这里奇怪的地方是 , 在以上代码中我们只是声明了两个函数和house , 并没有调用任何函数 , 运行后控制台竟然会打印出中的信息 , 原因就在于我们使用了装饰器@
def decorate(func):# 装饰器接收一个函数作为入参print('外层打印测试')print('内层加载完成……')func()@decorate# 装饰器def house():# 被装饰函数print('我是毛坯房')
装饰器的案例测试:
#既不需要侵入 , 也不需要函数重复执行import timedef deco(func):def wrapper():startTime = time.time()func()endTime = time.time()msecs = (endTime - startTime)*1000print("time is %d ms" %msecs)return wrapper@decodef func():print("hello")time.sleep(1)print("world")if __name__ == '__main__':f = func #这里f被赋值为func , 执行f()就是执行func()f()