此系列文档:

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

现在有个大问题:

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

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

使用的场景有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装饰器两层和三层_我终于弄懂了Python的装饰器(三)相关推荐

  1. python装饰器两层和三层区别_学习python的第十五天(函数的装饰器,两层装饰器和三层装饰器)...

    06.01自我总结 一.装饰器 1.函数装饰圈的定义 函数装饰器:一种装饰函数的函数 2.个人理解两层函数装饰器 两层函数装饰器个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数对其头 ...

  2. controller 用 map 接收值_一文弄懂apply、map和applymap三种函数的区别

    CDA数据分析师 出品 在日常处理数据的过程中,会经常遇到这样的情况,对一个DataFrame进行逐行.逐列或者逐元素的操作,很多小伙伴也知道需要用到apply.map或者applymap,但是具体什 ...

  3. python中snip_我终于弄懂了Python的装饰器(三)

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

  4. Python函数的装饰器,两层装饰器和三层装饰器

    一.装饰器 1.函数装饰圈的定义 函数装饰器:一种装饰函数的函数 2.个人理解两层函数装饰器 两层函数装饰器个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数对其头尾进行添加程序,但是 ...

  5. 两层和三层网络架构差异

    园区网络的物理架构推荐采用树形组网,不仅便于部署和管理,还具有良好的扩展性.树形组网通常采用分层架构,园区网络的层次一般包括终端层.接入层.汇聚层和核心层等.针对接入层.汇聚层和核心层的层次结构,在实 ...

  6. python的格式化输入_一看就懂的Python输入和输出、格式化字符串方法

    程序的输出可以有多种形式:我们可以将数据以人类可读的形式打印到屏幕上,或者将其写入到文件中以供后续使用. 格式化输出 迄今为止,在 Python 中存在两种输出值的方法:表达式语句以及 print() ...

  7. python装饰器函数执行后日志_一篇文章搞懂Python装饰器所有用法

    如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 它放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起 ...

  8. python对室内设计师有什么用_什么时候会用到python装饰器

    扩展回答 什么时候会用到python装饰器 所谓装饰器就是把函数包装一下,为函数添加一些附加功能,装饰器就是一个函数,参数为被包装的函数,返回包装后的函数:你可以试下:1234567891011121 ...

  9. python为什么用两个等于号_刷Leetcode学python(一)两数之和

    本代码来自好友詹神公众号<小詹学python> 原题: Given an array of integers, return indices of the two numbers such ...

最新文章

  1. 《c++ templates》学习笔记(9)——第十二章 特化与重载
  2. 远程ubuntu虚拟机Tensorflow搭建 - 1 SSH连接
  3. jquery.autocomplete修改 实现键盘上下键 自动填充
  4. 方法:查询MongoDB数据库中最新一条数据(JAVA)
  5. CF372D. Choosing Subtree is Fun
  6. linux openjdk_OpenJDK作为Linux上的默认Java
  7. android获取工程中所有类名,android 获取手机的所有程序和widget的包名和启动类名...
  8. 语音识别,搜狗的下一个大梦想?
  9. 用windows通过xrdp远程连接到ubuntu16后 Tab键无法使用
  10. Office2016+Visio2016安装过程
  11. 配置Eclipse for Java 9
  12. DirectX11 With Windows SDK--28 计算着色器:波浪(水波)
  13. 基于php+mysql的网上购物商城系统
  14. 台式电脑接路由器步骤_台式电脑如何连接路由器上网_路由器怎么连接台式电脑-系统城...
  15. 025 导数的四则求导法则之u+v、uv、u/v求导
  16. 允许在CAD中操作超链接!Aspose.CAD最新版v19.9新功能你都了解吗?
  17. 集群环境下,谁偷走quartz配置的定时任务
  18. University's Little_Mess Note(more) [李园7舍_404]
  19. python+selenium爬虫,使用selenium爬取热门微博数据
  20. 一篇搞懂Python中的随机数

热门文章

  1. 打开Jupyter Notebook 时报错:EnvironmentLocationNotFound: Not a conda environment:
  2. 优达学城深度学习之三(上)——卷积神经网络
  3. Fisher线性判别(*)
  4. day33 java的注解
  5. JSP页面元素-新手向
  6. idea 无效的目标发行版_maven构建异常(无效的目标发行版: 1.8)
  7. mysql并行加载机制_Mysql表引擎优化
  8. php mysql 链表_浅谈PHP链表数据结构(单链表)
  9. ROS中阶笔记(二):机器人系统设计—URDF机器人建模
  10. oracle hibernate 主键,oracle hibernate 主键自增