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

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

  • 相关阅读:
    移动文件夹时,千万别直接移动系统文件夹,应该直接复制或者移动这个系统文件夹内的内容
    UIView的intrinsicContentSize方法,在按钮中重写
    Reveal v4(8796) 使用
    AppCode 2016.3 注册码
    BSD process name correspondlng to current thread: knernel_task Mac OS version Not yet set
    iOS 适配HTTPS
    [Graphics] UIColor created with component values far outside the expected range, Set a breakpoint on UIColorBreakForOutOfRangeColorComponents to debug. This message will only be logged once.
    SB中设置UITextField 无边框,真机上输入汉字聚焦时,文字 下沉
    TTTAttributedLabel 富文本小记
    iOS 应用数据存储的常用方式
  • 原文地址:https://www.cnblogs.com/captainmeng/p/7792298.html
Copyright © 2020-2023  润新知