zoukankan      html  css  js  c++  java
  • 接口测试基础——第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的返回(返回的只是函数名)。

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

  • 相关阅读:
    关于Netty4.x中文教程系列更新进度的说明和道歉
    Netty4.x中文教程系列(四) ChannelHandler
    Netty4.x中文教程系列(三) Hello World !详解
    Netty4.x中文教程系列(二) Hello World !
    Netty4.x中文教程系列(一) 目录及概述
    【推荐】HTML5 UI框架 推荐
    【转载】【JQuery学习】jQuery插件开发
    前端与后端的数据交互(jquery ajax+python flask)
    【JS教程32】ajax
    【JS教程31】json
  • 原文地址:https://www.cnblogs.com/captainmeng/p/7792298.html
Copyright © 2011-2022 走看看