资讯专栏INFORMATION COLUMN

关于python的装饰器decorator

tinna / 2000人阅读

摘要:刚接触,看到装饰器相关的内容花了不少时间理解,参考了一些博客,这里做一些总结。用提供的语法糖来降低字符输入量。定义函数时加上这一行与另外写完全等价如有错漏,请指正参考资料

刚接触python,看到装饰器相关的内容花了不少时间理解,参考了一些博客,这里做一些总结。

先定义一个简单的函数foo

def foo():
    print "call foo()"

现在我们想要计算次函数执行的时间,于是修改代码如下

import time

def foo():
    start = time.clock()
    print "call foo()"
    end = time.clock()
    print "using time:",end - start
    

思考一下,这样做能够实现,可是如果我还想知道另一个foo_1的运行时间,那我只能把上面新增加的代码复制到foo_1这个函数里面,十分麻烦,能不能够不要改变原本的函数,即计算时间的代码不加在本来的函数里面。

这应该不难,很容易想到可以这样写

import time
 
def foo():
    print "call foo()"
 
def cal_time(func):
    start = time.clock()
    func()
    end =time.clock()
    print "using time:", end - start
 
cal_time(foo)

这样,如果还需要计算函数foo_1的时间,只需要cal_time(foo_1)就好了。

但是,这样其实改变了函数原本的调用方式,开始我们是这样调用foo()
现在是cal_time(foo)

那么如果现在需要修改foofoo_plus,我就必须更改n处调用了foo的代码!

还有更好的实现方式吗?能否使调用foo()产生时调用cal_time(foo)的效果?
可以想到,把cal_time(foo)的返回值赋给foo,看看下面的实现

import time
 
def foo():
    print "call foo()"
 
# 定义一个计时器,传入一个函数,并返回另一个附加了计时功能的方法
def cal_time(func):
     
    # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
    def wrapper():
        start = time.clock()
        func()
        end =time.clock()
        print "using time:", end - start
     
    # 将包装后的函数返回
    return wrapper
 
foo = cal_time(foo)
foo()

这样便无需改变原函数及其调用,想计算函数foo的用时,在函数调用foo()前,加上foo = cal_time(foo)即可。

用Python提供的语法糖来降低字符输入量。

import time
 
def cal_time(func):
    def wrapper():
        start = time.clock()
        func()
        end =time.clock()
        print "using time:", end - start
    return wrapper
 
@cal_time               #定义函数时加上这一行与另外写foo = cal_time(func):完全等价
def foo():
    print "call foo()"
 
foo()

如有错漏,请指正

参考资料:
1.http://www.cnblogs.com/rollen...
2.https://www.liaoxuefeng.com/w...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41051.html

相关文章

  • Python装饰-装饰流程,执行顺序

    摘要:最近看到一个关于的题文章其中的一个是装饰器的顺序问题就想写篇博客回顾下装饰器首先强烈推荐很久之前看的一篇博文翻译理解中的装饰器关于什么是装饰器看这篇文章就好了这里主要想写关于多个装饰器的执行流程装饰顺序示例代码初始化初始化输出结果初始化初始 最近看到一个关于Flask的CTF(RealWorld CTF 2018 web题bookhub)文章其中的一个trick是装饰器的顺序问题,就想...

    cpupro 评论0 收藏0
  • Python装饰另类用法

    摘要:今天我们一起探讨一下装饰器的另类用法。语法回顾开始之前我们再将装饰器的语法回顾一下。例子本身只是演示了装饰器的一种用法,但不是推荐你就这样使用装饰器。类装饰器在以前,还不支持类装饰器。 之前有比较系统介绍过Python的装饰器(请查阅《详解Python装饰器》),本文算是一个补充。今天我们一起探讨一下装饰器的另类用法。 语法回顾 开始之前我们再将Python装饰器的语法回顾一下。 @d...

    hqman 评论0 收藏0
  • Python 装饰使用指南

    摘要:装饰器是可调用的对象,其参数是另一个函数被装饰的函数。第二大特性是,装饰器在加载模块时立即执行。另一个常见的装饰器是,它的作用是协助构建行为良好的装饰器。 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。 装饰器基础知识 首先看一下这段代码 def deco(fn): print I am %s! % fn.__name__ @deco def func(): ...

    NeverSayNever 评论0 收藏0
  • 详解Python装饰

    摘要:概括的讲,装饰器的作用就是为已经存在的函数或对象添加额外的功能。在理解这些装饰器之前,最好对函数的闭包和装饰器的接口约定有一定了解。是一个非常简单的装饰器加强包。 Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里。 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数。 def say_hello(): ...

    DandJ 评论0 收藏0
  • Python Decorator装饰创建方法及常用场景分析

      小编写这篇文章的一个主要目的,主要是来给大家详细解答一些关于Python Decorator的相关知识,涉及到的内容主要是关于装饰器的一些介绍,比如,装饰器的一些常见创建方法,还有一些具体的场景,下面就给大家详细解答下。  前言  1.装饰器本质是一个语法糖,是对被装饰方法或类进行的功能扩充,是一种面向切面的实现方法  2.装饰器可以分成方法装饰器和类装饰器,他们的区别是一个是用函数实现的装饰...

    89542767 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<