装饰器和闭包常常为程序员们减少了很多代码量,在Python学习中,装饰器和闭包是常用的两个知识点。今天,我们一块来学习一下。
装饰器可以实现在代码运行期间修改函数的上下文,简单来说就是,在不改变原函数的情况下,丰富原函数的功能;而闭包简单来说就是,内层函数调用外层函数的变量,外层函数返回内层函数的引用。两者也有着密不可分的关系!!!
闭包函数
闭包函数是函数嵌套、函数对象、名称空间与作用域结合体
闭包中被内部函数引用的变量,不会因为外部函数结束而被释放掉,而是一直存在内存中,直到内部函数被调用结束
说了这多理论,上代码。
需求:统计下载媒体文件的时间(简易版)
以上代码确实实现了统计下载时间的功能,问题来了,如果我有多个类型文件下载函数,都需要统计时间呢?难道展现我们的“CV大法”?估计隔天就要被扫地出门了……
就没有什么办法可以解决了吗?当然有啦!先看代码
以上代码就是对装饰器的引入,其中 time_record 就是装饰器,download_movie 和 download_music 就是被装饰的函数对象。
通过观察,以上被装饰的函数对象是没有返回值,且没有参数的。问题来了,假如 download_movie 等被装饰对象是有返回值和参数,那该咋整?
不说废话,继续看代码
细心如你,装饰器定义好了,但是每次调用都特别麻烦,有没有一种比较便捷的调用方式呢?
当当当当!当然有,那就是装饰器的语法糖,听起来就感觉使用非常甜,咋用呢?继续看代码(由于之前代码已经实现了装饰器,这里就不重复展示了,只实现语法糖的代码)
装饰器语法糖
注意:在使用时,装饰器必须在被装饰对象之前定义
怎么样?是不是感觉意犹未尽?是不是急着想自己练习一下呢?那就行动起来吧!!!