在Python里面函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数,简单来说函数也是变量也可以作文函数的参数

>>> def funA():
... print('i an funA')
...   time.sleep(1)
>>> f = now
>>> f()
i am funA

函数对象有一个__name__属性,可以拿到函数的名字:

>>> funA.__name__
'funA'
>>> f.__name__
'funA'

当我们想计算这个函数的运行时间,可以再创一个函数:

def print_time():
start = time.time()
funA()
end = time.time()
print('耗时%s秒' % (end - start)) >>>print_time()

i am funA
耗时1.0043737888336182秒

这时调用的并不是funA()而是print_time(),要是我们只能调用funA又要输出他的函数运行时间,这该怎么办?这时就可以派出今天的主人公,deractor(装饰器),简单来说在一个函数里面再嵌套一个函数,在这之前再看一个版本:

import time
# 随便定义一个函数
def funA():
print('i am funA')
time.sleep(1) def log(func):
def wrapper():
start = time.time()
func()
end = time.time()
print('耗时%s秒' % (end - start))
return wrapper if __name__ == '__main__':
n = log(funA)
n()

输出结果为:

i am funA
耗时1.0012261867523193秒

依旧可以,但好像有点麻烦,我们可以在def funA():上面加上@log,有个小细节,log(func)必须要在funA()之前,不然@log找不到,总的代码贴上:

import time
# 随便定义一个函数
def log(func):
def wrapper():
start = time.time()
func()
end = time.time()
print('耗时%s秒' % (end - start))
return wrapper
@log
def funA():
print('i am funA')
time.sleep(1) if __name__ == '__main__':
funA()

运行结果和上面一样,这样看起来就好多了,当然一个函数不单单可以嵌套一个函数,可以多个看你的需求,不同的嵌套发挥不同的作用。一开始说的,每个函数有个自带的.__name__属性,在主函数加个print(funA().__name__)会发现输出的是wrapper,这是因为log里面return的是wrapper,在某些情况下我们需要根据函数所属名来判断条件,那装饰器就成为累赘了,还好有个module(模块)叫functools,导入它并在def wrapper():前面加上@functools.wraps(func),意思就是将func包起来,不让他指向别的函数,这下运行结果就正常了:

import time
import functools
# 随便定义一个函数
def log(func):
# 函数可以接受任意参数的调用
@functools.wraps(func)
def wrapper():
start = time.time()
func()
end = time.time()
print('耗时%s秒' % (end - start))
return wrapper
@log
def funA():
print('i am funA')
time.sleep(1) if __name__ == '__main__':
funA()
print(funA.__name__)

运行结果:

i am funA
耗时1.0033290386199951秒
funA

Python3.5:装饰器的使用的更多相关文章

  1. (转)Python3.5——装饰器及应用详解

    原文:https://blog.csdn.net/loveliuzz/article/details/77853346 Python3.5——装饰器及应用详解(下)----https://blog.c ...

  2. python3.7 装饰器

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 装饰器 #装饰器 ''' 定义:本质就是一个函数,作用是为其他函 ...

  3. python3练习-装饰器

    在廖雪峰的官方网站学习装饰器章节时,初步理解类似与面向切面编程.记录一下自己的课后习题解法. 问题: 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call ...

  4. python3之装饰器

    1.装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处 ...

  5. python3之装饰器修复技术@wraps

    普通函数 def f(): """ 这是一个用来测试装饰器修复技术的函数 """ print("哈哈哈") if __n ...

  6. Python3中装饰器的使用

    较为复杂的装饰器使用: user,passwd = 'hjc',111111 def auth(type): print('auth type:',type) def outwrapper(func) ...

  7. python3 使用装饰器,及函数作为参数

    #装饰import typesdef shucai(n): print('蔬菜价格7') if type(n)==types.FunctionType: return n()+7 return n+7 ...

  8. 【python3】装饰器

    参考文章: 理解Python装饰器(Decorator) 关键点: 写装饰器一定要搞定楚函数名后面带小括号和不带小括号的含义.带小括号,表示调用这个函数,而不带小括号,则表示的是该函数引用地址 简单装 ...

  9. python3中装饰器的用法总结

    装饰器预备知识点 1 函数赋值给一个变量 函数名可以像普通变量一样赋值给另一个变量. def test(): print("i am just a test function") ...

随机推荐

  1. 老男孩Python全栈开发(92天全)视频教程 自学笔记03

    day3课程目录: pyhton的历史 32bit和64bit系统的区别 Python版本的选择 第一个pyhton程序 文件后缀名及系统环境变量的介绍 pyhton程序的执行和其他编程语言的简单对比 ...

  2. 最大信息系数(MIC)——Detecting Novel Associations in Large Data Sets

    本文介绍了一种发现两个随机变量之间依赖关系强度的度量MIC(最大信息系数,类似于相关系数的作用).MIC具有以下性质和优势: MIC度量具有普适性.其不仅可以发现变量间的线性函数关系,还能发现非线性函 ...

  3. 十、Hadoop学习笔记————Hive与Hbase以及RDBMS(关系型数据库)的关系

    Hive目的是为了简化MapReduce编程 实际应用中,Hive与Hbase不经常链接

  4. StringUtils工具类常用方法汇总1(判空、转换、移除、替换、反转)

      Apache commons lang3包下的StringUtils工具类中封装了一些字符串操作的方法,非常实用,使用起来也非常方便.最近自己也经常在项目中使用到了里面的一些方法,在这里将常用的方 ...

  5. 【转】如何使用Git上传本地项目到github?(mac版)

    原文链接:http://www.cnblogs.com/lijiayi/p/pushtogithub.html 在此假设你已经在 github 上创建好了一个项目,像这样: 并且你已经完成了自己的项目 ...

  6. Java编程学习技巧和方法总结

    干货:必须要有反馈,不断调整,多读书,多些笔记. 解释:不练习你以为你能掌握?笑话,只有自己根据一个个小目标不断的敲,运行,给予你反馈,这样才会真的进步. 纸上谈Java,是永远停止在口.   关于笔 ...

  7. 【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign

    上一篇文章讲到了负载均衡在Spring Cloud体系中的体现,其实Spring Cloud是提供了多种客户端调用的组件,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使 ...

  8. JAVA读取、写入Excel表格(含03版)

    引言 工作中可能会遇到对Excel读取和写入,如果我们自己手动写的话,会很麻烦,但是Apache中有poi工具类.poi工具类封装好了对于Excel读取和写入,我们需要用的时候,直接调用该方法就好了. ...

  9. 【tyvj P4879】骰子游戏

    http://www.tyvj.cn/p/4879 首先,投一个骰子,每个数字出现的概率都是一样的.也就是不算小A的话,n个人投出x个骰子需要的次数和点数无关. 计数问题考虑dp,令f(i,j)为前i ...

  10. js 匹配2个字符串相似度

    strSimilarity2Number: function (s, t) { var n = s.length, m = t.length, d = []; var i, j, s_i, t_j, ...