接口测试基础——第7篇 简单的Python知识普及(二)之装饰器
今天我们来学习python里面的“装饰器”
1、我在函数test运行前想先打印一些内容怎么办?
def func(param):
print u"打印的内容"
param()
def test():
print u"test内容"
func(test)
以上代码即可实现,但是如果我有很多函数都要运行前先打印同样的内容,一个一个的去写就会显得非常笨拙。所以有必要有一个方法,只要通过一定的方式即可实现“调用”。
2、闭包
先看一段代码
def closure_conf(prefix):
def innerFunc(name):
print prefix, name
return innerFunc
holiday = closure_conf("10月1日是:")
# holiday("国庆节")
print "function name is:", holiday.__name__
运行以后输出为:
function name is: innerFunc
代码分析:
我们先定义了一个函数closure_conf(prefix);在该函数内部我们嵌套了另一个函数innerFunc(name);在innerFunc函数中,我们调用了closure_conf的参数prefix(打印出来了);注意,closure_conf函数的返回是innerFunc,是一个函数名,仅仅是函数名,而不是调用(如果你这么写:innerFunc(),就是调用了)。简单来说,就是一个函数内嵌另一个函数,并且返回内嵌函数的函数名。
接下来是我们调用closure_conf并且传了一个参数,打印这个运行后的名字__name__。
一般来说运行什么函数,就应该打印出的名字就是这个函数名,但是这里我们发现打印的竟然是内嵌函数的名字,也就是说你给closure_conf传递了参数并运行时,函数变成了innerFunc,但是innerFunc并没有运行,因为没有打印innerFunc里面的语句。如果放开注释的语句,就发现可以运行innerFunc函数了。
以上就是一个闭包。也就是说,在Python中创建一个闭包需要满足以下三点:
- 闭包函数必须有内嵌函数
- 内嵌函数需要引用该嵌套函数上一级中的变量
- 闭包函数必须返回内嵌函数
3、装饰器
装饰器的定义是:装饰器实质上是一个函数。它把一个函数作为输入并且返回另外一个函数。其实是闭包概念的深化。
# coding: utf-8
from functools import wraps
def testFunc(func):
@wraps(func)
def wrapper(*args, **kwargs):
print func.__name__
print args
print kwargs
return func(*args, **kwargs)
return wrapper
@testFunc
def index(*args, **kwargs):
print 'welcome to index'
print index('10.1', holiday="nation's day")
运行以上代码:
index
('10.1',)
{'holiday': "naiton's day"}
welcome to index
以上代码就是装饰器了:粉色的func作为参数参数,并且作为蓝色的wrapper函数的返回(返回的是运行后的函数),而蓝色的func函数又是红色函数testFunc的返回(返回的只是函数名)。
微信公众号搜索“自动化测试实战”或扫描下方二维码添加关注~~~