python装饰器详解

170 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

python装饰器

python装饰器,顾名思义,就是对某一个特定函数进行“装饰”处理!其在特定功能方面用途很广。比如授权、日志、登录方面。

常规的装饰器写法:

image-20211122160455185

较为精简的装饰器写法:

image-20211122160506229

但是在返回 a_function_requiring_decoration函数名字时,会出现以下错误:

image-20211122160634452

这并不是我们想要的!Ouput输出应该是"a_function_requiring_decoration"。这里的函数被warpTheFunction替代了。它重写了我们函数的名字和注释文档。幸运的是Python提供给我们一个简单的函数来解决这个问题,那就是functools.wraps。我们修改上一个例子来使用functools.wraps:

image-20211014155636852

python装饰器的应用:

授权(Authorization):

image-20211122160737545

日志(logging):

image-20211014162919041

说到这里,其实python装饰器的作用就不言而喻,其看似花里胡哨,实则就是起到包装函数A的作用,当满足某种要求时去执行一个特定的函数B或者功能,之后退出函数B去继续执行函数A。

接下来看下更加复杂的情况:

带参数的装饰器:

来想想这个问题,难道@wraps不也是个装饰器吗?但是,它接收一个参数,就像任何普通的函数能做的那样。那么,为什么我们不也那样做呢? 这是因为,当你使用@my_decorator语法时,你是在应用一个以单个函数作为参数的一个包裹函数。记住,Python里每个东西都是一个对象,而且这包括函数!记住了这些,我们可以编写一下能返回一个包裹函数的函数。

image-20211014165648227