常规的装饰器写法:
较为精简的装饰器写法:
但是在返回 a_function_requiring_decoration
函数名字时,会出现以下错误:
这并不是我们想要的!Ouput输出应该是"a_function_requiring_decoration"
。这里的函数被warpTheFunction
替代了。它重写了我们函数的名字和注释文档。幸运的是Python提供给我们一个简单的函数来解决这个问题,那就是functools.wraps
。我们修改上一个例子来使用functools.wraps:
python装饰器的应用:
授权(Authorization):
日志(logging):
说到这里,其实python装饰器的作用就不言而喻,其看似花里胡哨,实则就是起到包装函数A的作用,当满足某种要求时去执行一个特定的函数B或者功能,之后退出函数B去继续执行函数A。
接下来看下更加复杂的情况:
带参数的装饰器:
来想想这个问题,难道@wraps
不也是个装饰器吗?但是,它接收一个参数,就像任何普通的函数能做的那样。那么,为什么我们不也那样做呢? 这是因为,当你使用@my_decorator
语法时,你是在应用一个以单个函数作为参数的一个包裹函数。记住,Python里每个东西都是一个对象,而且这包括函数!记住了这些,我们可以编写一下能返回一个包裹函数的函数。