龙空技术网

从一个项目实例来总结一下python 函数装饰器的用法

积极的阳光i 77

前言:

而今姐妹们对“装饰器函数”大约比较关怀,小伙伴们都需要知道一些“装饰器函数”的相关知识。那么小编同时在网摘上搜集了一些对于“装饰器函数””的相关资讯,希望同学们能喜欢,同学们一起来学习一下吧!

实例:自动化测试流程中有一项任务是结果回填,就是要把自动化测试执行结果回填到TestLink。TestLink 的操作需要绑定个人账号,项目,计划和版本信息,这些信息需要在用例执行之前输入,在用例执行之后(生成测试结果),需要根据输入的

信息(测试人,项目,计划,版本等)将结果进行回填。简单地将,这项需求需要在测试执行前(输入以下结果回填相关的信息)后(根据回填信息进行结果回填操作)做一些操作,经过一番思考,python 装饰器完美的解决这个问题。

目前我的理解,python装饰器可以让你在一个函数的前后去执行代码,而且对于需要复用执行代码的场合更加合适。

装饰器使用场景

这个装饰器具体功能我省略了,本文不介绍功能,只借助这个应用场景总结一下python装饰器的用法。这个装饰器函数测试套suite作为了参数,可以大大提高这个装饰器函数的复用性。

先来看看编程王上对Python装饰器的一些说明,显然这个装饰器理解起来还是有些难度的。不急,我们从简单的开始,一步一步的来。

python函数装饰器

1.python中的函数

python中的函数

python中函数的普通调用,大家都会的。

2.在函数中定义(嵌套)函数

python函数中定义函数

那现在我们知道了可以在函数中定义另外的函数。也就是说:我们可以创建嵌套的函数。现在你需要再多学一点,就是函数也能返回函数。

3.从函数中返回函数

其实并不需要在一个函数里去执行另一个函数,我们也可以将其作为输出返回出来:

从函数中返回函数

再次看看这个代码。在 if/else 语句中我们返回 greet 和 welcome,而不是 greet() 和 welcome()。为什么那样?这是因为当你把一对小括号放在后面,这个函数就会执行;然而如果你不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它。 你明白了吗?让我再稍微多解释点细节。

当我们写下 a = hi(),hi() 会被执行,而由于 name 参数默认是 yasoob,所以函数 greet 被返回了。如果我们把语句改为 a = hi(name = "ali"),那么 welcome 函数将被返回。我们还可以打印出 hi()(),这会输出 now you are in the greet() function。

4.将函数作为参数传给另一个函数

python函数作为参数传参

现在你已经具备所有必需知识,来进一步学习装饰器真正是什么了。装饰器让你在一个函数的前后去执行代码。将函数作为参数传给另一个函数已经有装饰器的雏形了。

5.你的第一个装饰器

在上一个例子里,其实我们已经创建了一个装饰器!现在我们修改下上一个装饰器,并编写一个稍微更有用点的程序:

python装饰器函数示例

你看明白了吗?我们刚刚应用了之前学习到的原理。这正是 python 中装饰器做的事情!它们封装一个函数,并且用这样或者那样的方式来修改它的行为。现在你也许疑惑,我们在代码里并没有使用 @ 符号?那只是一个简短的方式来生成一个被装饰的函数。这里是我们如何使用 @ 来运行之前的代码:

希望你现在对 Python 装饰器的工作原理有一个基本的理解。如果我们运行如下代码会存在一个问题:

print(a_function_requiring_decoration.__name__)

# Output: wrapTheFunction

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

到了这一步应该可以在项目中根据合适的场景选用装饰器了。后面再总结一下装饰器的使用场景和装饰器类的使用。

最后再稍微总结一下:

1)装饰器是python的一个重要部分

2)装饰本身也是一个函数

3)装饰器封装(嵌套)了函数

4)装饰器用@ 符号

5)装饰器让你在一个函数的前后去执行代码

标签: #装饰器函数