此系列文档:

三、装饰器应该在何时发挥作用?

现在有个大问题:

我可以使用装饰器做什么?

装饰器看起来很酷而且功能强大,但是展示一个实际的例子会更清晰。

使用的场景有1000种可能性。但是经典用法:

通过外部库来扩展函数的行为(在您不能对其进行修改的情况下)。

用于调试(您不希望对其进行修改,因为它是临时的)。

重复使用功能,可以通过装饰器来加到其他多个函数上。

您可以使用它们以链式的方式扩展多个功能,如下所示:

def benchmark(func):

"""

装饰器,打印函数执行花费的时间。

"""

import time

def wrapper(*args, **kwargs):

t = time.clock()

res = func(*args, **kwargs)

print("{0} {1}".format(func.__name__, time.clock()-t))

return res

return wrapper

def logging(func):

"""

装饰器,记录脚本的活动。(它实际上只是打印出来,但可能是在记录日志!)

"""

def wrapper(*args, **kwargs):

res = func(*args, **kwargs)

print("{0} {1} {2}".format(func.__name__, args, kwargs))

return res

return wrapper

def counter(func):

"""

装饰器,计算并打印执行功能的次数

"""

def wrapper(*args, **kwargs):

wrapper.count = wrapper.count + 1

res = func(*args, **kwargs)

print("{0} has been used: {1}x".format(func.__name__, wrapper.count))

return res

wrapper.count = 0

return wrapper

@counter

@benchmark

@logging

def reverse_string(string):

return str(reversed(string))

print(reverse_string("Able was I ere I saw Elba"))

print(reverse_string("A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal: Panama!"))

#输出:

#reverse_string ('Able was I ere I saw Elba',) {}

#wrapper 0.0

#wrapper has been used: 1x

#ablE was I ere I saw elbA

#reverse_string ('A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal: Panama!',) {}

#wrapper 0.0

#wrapper has been used: 2x

#!amanaP :lanac a ,noep a ,stah eros ,raj a ,hsac ,oloR a ,tur a ,mapS ,snip ,eperc a ,)lemac a ro( niaga gab ananab a ,gat a ,nat a ,gab ananab a ,gag a ,inoracam ,elacrep ,epins ,spam ,arutaroloc a ,shajar ,soreh ,atsap ,eonac a ,nalp a ,nam A

当然,使用装饰器的好处是您可以立即在几乎所有内容上使用它们而无需重写。比如:

@counter

@benchmark

@logging

def get_random_futurama_quote():

from urllib import urlopen

result = urlopen("http://subfusion.net/cgi-bin/quote.pl?quote=futurama").read()

try:

value = result.split("
")[1].split("")[0]

return value.strip()

except:

return "No, I'm ... doesn't!"

print(get_random_futurama_quote())

print(get_random_futurama_quote())

#输出:

#get_random_futurama_quote () {}

#wrapper 0.02

#wrapper has been used: 1x

#The laws of science be a harsh mistress.

#get_random_futurama_quote () {}

#wrapper 0.01

#wrapper has been used: 2x

#Curse you, merciful Poseidon!

python中snip_我终于弄懂了Python的装饰器(三)相关推荐

  1. python创建一个字典、关键字为只包含字母的字符串_探究Python源码,终于弄懂了字符串驻留技术...

    摘要:在本文中,我们将深入研究 Python 的内部实现,并了解 Python 如何使用一种名为字符串驻留(String Interning)的技术,实现解释器的高性能. 每种编程语言为了表现出色,并 ...

  2. 探究Python源码,终于弄懂了字符串驻留技术

    摘要:在本文中,我们将深入研究 Python 的内部实现,并了解 Python 如何使用一种名为字符串驻留(String Interning)的技术,实现解释器的高性能. 每种编程语言为了表现出色,并 ...

  3. python作用域的理解-python中对变量的作用域LEGB、闭包、装饰器基本理解

    一.作用域 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域.python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量 ...

  4. python装饰器两层和三层_我终于弄懂了Python的装饰器(三)

    此系列文档: 三.装饰器应该在何时发挥作用? 现在有个大问题: 我可以使用装饰器做什么? 装饰器看起来很酷而且功能强大,但是展示一个实际的例子会更清晰. 使用的场景有1000种可能性.但是经典用法: ...

  5. 计算机考研英语一和英语二的区别,考研英语一和英语二的区别 今天终于弄懂了!...

    原标题:考研英语一和英语二的区别 今天终于弄懂了! 大家在最后三个月冲刺需要注意: 1.建议留几套真题,做考前模拟,精读真题可以用 <考研圣经>(英语二用)98-07 年的真题,都是逐词逐 ...

  6. 淘宝特价版拉新赚钱的页面怎么做?我终于弄懂了

    淘宝的同胞兄弟特价版,虽然长的朴实无华以至于经常被人问起淘宝特价版靠谱吗?2021年淘宝特价版可谓大火了一把,阿里巴巴不计成本的大力推广淘宝特价版,目的也非常明确要把拼多多占领的市场掠夺回来.最近还传 ...

  7. python中常见的运行时错误_17个常见Python运行时错误

    转载自:https://zhuanlan.zhihu.com/p/29693078 当初学 Python 时,想要弄懂 Python 的错误信息的含义可能有点复杂.这里列出了常见的的一些让你程序 cr ...

  8. [转载] python中的且语句_简单探讨python中的语句和语法

    参考链接: 在Python中解包:并行分配之外 python程序结构 python"一切皆对象",这是接触python听到最多的总结了.在python中最基层的单位应该就是对象了, ...

  9. python中numpy数组的合并_基于Python中numpy数组的合并实例讲解

    基于Python中numpy数组的合并实例讲解 Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np. ...

最新文章

  1. linux对文件的描述,对Linux文件系统的简单理解
  2. 数据分析系列:完善统计图(matplotlib)
  3. Spring表单的initBinder:绑定表单复杂属性
  4. datatable 创建列赋值_Datatable 添加新列并赋值
  5. 涨跌因子计算器下载哪里下载_小白计算器软件下载-小白计算器app下载 v1.0 安卓版...
  6. 一个逐步“优化”的范例程序(转)
  7. 小心使用tf.image.resize_images,填坑经验分享给你
  8. lua jit java jit_Lua JIT 2.0 发布了,一百五十倍的性能提升!
  9. Java 向量元素的索引值
  10. ~~字符串哈希(数据结构)(附模板题AcWing 841 字符串哈希)
  11. sql分别对两列数据求和以不同的条件_利用数组与字典,实现双条件数据汇总的方法...
  12. 基于Android P,自定义Android开机动画的方法
  13. 50位中国女性科学家入选2022福布斯
  14. Ubuntu下deb文件安装方法图文详解
  15. 将Unity地形以Wavefront Obj格式导出
  16. CRPR能补偿crosstalk吗?
  17. 等保测评--计算环境安全测评
  18. C# 鼠标悬浮mouseHover事件的添加 实现鼠标悬浮在按钮或者控件 显示相关的帮助信息
  19. Python 爬虫入门(1)获取豆瓣网页源代码
  20. [再寄小读者之数学篇](2014-11-20 计算二重积分)

热门文章

  1. 为什么专业工程师对前端开发不屑一顾?
  2. 底层I/O性能大PK:Python/Java被碾压,Rust有望取代C++
  3. 漫谈 MinIO 集群扩容方法
  4. 你熟知的开源项目,幕后推手竟然是他们?
  5. 历时3个月,我们是如何为一个开源项目集资300万美元的?
  6. 腾讯云三大自研数据库之一 TBase 开源后首次重磅升级,复杂查询性能最高提升十倍
  7. “不要害怕 RAID!”
  8. 过去15年,到底是什么真正推动了云计算的革命?
  9. 300 行代码带你秒懂 Java 多线程!| 原力计划
  10. 招聘数下降71%!程序员:你的努力正在毁掉自己!