今天我们来聊聊一种能给你的代码变得“加料”的神器——Python装饰器。
就像一杯咖啡,原本它是苦的,为了让它符合我的口味,我给它添加了糖,添加之后就完美的符合了我的口味。
那么,装饰器又是如何给代码进行“加料”呢?
Python装饰器提供了一个更为优雅的方式来增强现有函数的行为,并且不需要修改现有的函数代码及调用方式。
接下来通过一个案例来介绍一下装饰器的原理和实际的行为。
这里有一个函数,他就像一个勤劳的快递员,每次运行都送一次快递。
现在我们想知道它每次送快递需要多长时间,这时候装饰器就派上用场了,我们可以使用装饰器来给它添加计时的功能。
这是使用语法糖给函数添加装饰器的用法。
下面的部分称为原函数,上面的部分称装饰器函数,此时去调用原函数时,它除了会执行原本的功能外,还会执行装饰器给它添加的计时的功能。
这是装饰器最常见的写法,但它是怎么给函数增加新功能的呢?我们来看去除掉语法糖后装饰器的本来面目。
如果不使用语法糖,它本质上就是装饰器函数的一次调用,特殊的是它会将原函数作为参数传递给装饰器函数。而在装饰器函数中,它接收一个函数作为参数,并且在它的内部定义了一个新的函数,最后将新函数进行返回。在这里我们称timer decorator为外函数,称wrapper为内函数,而这个func就是原函数。
外函数将内函数名称进行返回并赋值为原函数的函数名,下面在调用原函数的函数名时,实际上调用的是内函数。
内函数被执行后,首先会记录当前时间,然后调用func,func是什么?是外函数的形参,这里可能有人会疑惑,外函数已经执行完了,为什么func还会存在呢?
这其实就是装饰器函数的立身之本:内函数所使用的外函数数据不会随着外函数的调用而销毁,所以此时func就指向了原函数,在调用内函数时,这里的func()可以去执行原函数,接着记录一下时间,最后通过差值得到执行函数所需要的时间。至此,通过装饰器我们不仅为原函数添加了新的功能,并且还没有修改其调用方式。
而语法糖的存在就是为了省略这一行代码,由此就形成了我们常见的装饰器了。
完整视频链接:
https://www.bilibili.com/video/BV1fGHDepExY?t=1.2
全部0条评论
快来发表一下你的评论吧 !