装饰器和闭包常常为程序员们减少了很多代码量,在Python学习中,装饰器和闭包是常用的两个知识点。
python学习之装饰器和闭包的艺术
装饰器可以实现在代码运行期间修改函数的上下文,简单来说就是,在不改变原函数的情况下,丰富原函数的功能;而闭包简单来说就是,内层函数调用外层函数的变量,外层函数返回内层函数的引用。两者也有着密不可分的关系!!!
python学习之装饰器和闭包的艺术
了解了闭包和装饰器的定义,接下来我们来演示下:
Firstly,我们定义一个能打印"Info南"的函数并调用。
现在,我们在不改变原函数结构的情况下,为其添加一个功能:在打印“Info南”前,先打印出"Hello Python", 这个时候就该装饰器出马了。
定义一个装饰器: 它需要接受一个参数,该参数表示了要被装饰的函数(即my_name):
将相应的函数关装饰起来:使用@my_motto写在被装饰函数的前面(装饰器符号“@”属于语法糖,使得我们的代码更加简洁方便)
执行被装饰函数:在执行my_name函数的时候, 就可以在输出"Info南"之前先输出"Hello Python"
在上面的代码中, 最让我们疑惑的是装饰器函数定义里面的wrapper函数, 装饰器本身返回的是wrapper函数的定义, 而wrapper中则定义了对被装饰函数(my_name)的调用, func表示的就是被装饰函数, 装这就是饰器的作用。
my_motto的最终返回的wrapper函数的定义, 并不是执行结果,只有当wrapper真正执行的时候, 才会真正的执行my_name方法, 这就是闭包概念。
wrapper中的参数, 实际上则是传递给func(实际上是my_name)的参数
python学习之装饰器和闭包的艺术
总而言之, Python在函数定义中装饰器的实现, 其本质也只是使用了闭包的思路, 延迟调用, 并在调用前后拓展其他功能
领取专属 10元无门槛券
私享最新 技术干货