接口测试基础——第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的返回(返回的只是函数名)。

 

微信公众号搜索“自动化测试实战”或扫描下方二维码添加关注~~~

posted @ 2017-11-06 11:29  孟船长  阅读(256)  评论(0编辑  收藏  举报