今天我们来学习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的返回(返回的只是函数名)。

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

接口测试基础——第7篇 简单的Python知识普及(二)之装饰器的更多相关文章

  1. python高级 之(二) --- 类装饰器

    装饰器-初级 在不改变原有函数逻辑功能的基础上,为函数添加新的逻辑功能.使代码可读性更高.结构更加清晰.冗余度更低 简介 """ 闭包: 函数嵌套的格式就是闭包.写装饰器 ...

  2. 【Python学习之二】装饰器

    装饰器 首先,给出装饰器的框架: def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return ...

  3. Python 标准库中的装饰器

    题目描述 1.简单举例 Python 标准库中的装饰器 2.说说你用过的 Python 标准库中的装饰器 1. 首先,我们比较熟悉,也是比较常用的 Python 标准库提供的装饰器有:property ...

  4. NHibernate 映射基础(第三篇) 简单映射、联合主键

    NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...

  5. 简学Python第四章__装饰器、迭代器、列表生成式

    Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群  群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...

  6. Python全栈开发之---装饰器

    1.装饰器的形成过程 import time def func1(): print('in func1') def timer(func): def inner(): start = time.tim ...

  7. python学习日记(函数--装饰器)

    楔子 前提,我有一段代码(一个函数). import time def run_time(): time.sleep(0.1) print('我曾踏足山巅') 需求1:现在,我想计算这段代码的运行时间 ...

  8. Python的私有变量与装饰器@property的用法

    Python的私有变量是在变量前面加上双横杠(例如:__test)来标识, Python私有变量只能在类内部使用,不被外部调用,且当变量被标记为私有后,调用时需再变量的前端插入类名,在类名前添加一个下 ...

  9. Python函数07/有参装饰器/多个装饰器装饰一个函数

    Python函数07/有参装饰器/多个装饰器装饰一个函数 目录 Python函数07/有参装饰器/多个装饰器装饰一个函数 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 3.今日总结 3.今日练 ...

随机推荐

  1. 1-16-1 LVM管理和ssm存储管理器使用&磁盘配额

    大纲: 1-1- LVM逻辑卷的管理 1-2- SSM管理工具的使用 1-3- 磁盘配额技巧 ====================================== 问题描述: 当我们需要在一个 ...

  2. ZOJ 2599 Graduated Lexicographical Ordering ★(数位DP)

    题意 定义两个数的比较方法,各位数字之和大的数大,如果数字和相等则按字典序比较两个数的大小.输入n,k,求:1.数字k的排名:2.排名为k的数. 思路 算是一类经典的统计问题的拓展吧~ 先来看第一问. ...

  3. linux下使用FreeRDP 连接 Windows 远程桌面

    linux下使用FreeRDP 连接 Windows 远程桌面   简介 FreeRDP 是一款开源的远程桌面系统,支持多种平台, 在 ubuntu 中使用 FreeRDP 可以很方便的登录到 win ...

  4. iptables详解(11):iptables之网络防火墙

    我们一起来回顾一下之前的知识,在第一篇介绍iptables的文章中,我们就描述过防火墙的概念,我们说过,防火墙从逻辑上讲,可以分为主机防火墙与网络防火墙. 主机防火墙:针对于单个主机进行防护. 网络防 ...

  5. Quartz教程一:使用quartz

    原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处 ...

  6. 快速切题 sgu 112. a^b-b^a 大数 次方 难度:0 非java:1

    112. a^b-b^a time limit per test: 0.25 sec. memory limit per test: 4096 KB You are given natural num ...

  7. 12.18 aop身份验证

    对所有卖家页面进行身份验证,采用aop编程 步骤:1.获得request 2.查询cookie 3.查询redis 4.查询不通过时,采用抛出异常,捕捉异常,再异常里加入跳转到登陆页面的方法 准备工作 ...

  8. PostgreSQL 9.6 同步多副本、remote_apply记录

    摘自:https://yq.aliyun.com/articles/61274 同步多副本配置方法 参数配置如下 synchronous_standby_names (string) 支持两种写法 n ...

  9. etl工具-Bireme

    前段时间做数据仓库项目,自己实现了一部分etl功能,后面一直没有时间去深入挖掘.这个工具貌似不错,写个帖子做下记录: https://hashdatainc.github.io/bireme/READ ...

  10. Shell 命令行批量处理图片文件名

    Shell 命令行批量处理图片文件名 从网上下载了一堆图片,有的是*.jpg的,有的是*.jpeg的.并且文件名有长有短,很是糟心.因此,我想把这些文件给全部整理好,当然是用shell来处理啦! 说干 ...