看了不少python关于装饰器文章,觉得还挺实用,发贴来mark一下(以前做笔记总会长时间不看就忘记,放这里应该不会忘了吧 - -)

先来看一个简单的知识点:

def a():print("I'm a")#a 代表这个函数,在Python中函数名只是个指向函数首地址的函数指针而已
a() #执行函数

ok,接下来开始讲装饰器,看下面的小例子:

def a(func):print("a running!")return func@a
def b():print("b running!")b()

当python读到@a的时候,其实执行的相当于 b=a(b),将下面的函数作为参数带入执行。这样我们在带入读下是不是变得很简单了,就是将b作为参数带入函数a中执行,再把函数a返回的结果赋值给b,等于重新定义了函数b;再来看内部的执行过程:

直接从@a开始,@a <==> b=a(b)

1.执行参数为b的a函数,打印“a running”

2.返回b,并将b赋值给b(这样也等于啥也没变!)所以也没有什么卵用!接下来我们再看一个开发中常用到的示例

示例2:

def a(b):print("a running!")def c():print("c running!")return b()return c@a
def b():print("b running!")b()

再看看这个函数的执行过程:

1.先将@a <==> b=a(b) ,相当于函数b等于被重新定义为a(b)的返回结果,

2.跳转a(b)的执行过程,先打印a running! 说明a运行了,接下来定义一个函数c,没啥输出,因为还没调用这个函数!注意这里的c函数return的b()的不是一个函数了啊,而是这个函数执行的结果,是将这个函数的结果作为返回值!这么做是有原因的(请看最后)

3.接下来才是return一个函数c,是不是相当于b=c(这就很有用了,在不改变函数b的情况下拓展了b的功能,真爽啊!)

所以最后这个b被定义成了这样:

b=def c():print("c runing!")return b()

4.再来执行b(),看看是不是输出了 c running !,又运行b()作为返回结果给调用者,当然函数b没有定义返回内容额,所以只运行了b()

最后解释下为什么要用return b(),return b()是运行b(),然后将返回的结果再返回,

这样想想看,没有使用装饰器之前,我调用b()是不是就是返回b()的结果啊,

现在加上装饰器,返回的是不是依然是b()的结果,这样对外看来我们调用b好像完全没有改变,但是实际上b在运行之前已经运行了我们的拓展功能了。。。不得不说666啊

总的来看其实主要就是@a 等价于 b=a(b) 理解了这个就ok啦,好处就是在不影响b函数的情况下,因为执行b还是返回原来的b返回的内容,增加了b函数的功能,是不是挺方便!!

转载于:https://www.cnblogs.com/chilo/p/8650769.html

python装饰器使用相关推荐

  1. python简单装饰器_简单介绍Python装饰器(一)

    装饰器的作用 相信大家在 探索过程中已经了解装饰器的作用,也有很多花里胡哨的介绍. 这次小冰也来讲解一下关于Python装饰器的一些小知识. 它的作用: 性能测试 日志 安全验证 ...... 相信大 ...

  2. Python装饰器的神奇功能:自动打印每个方法耗时

    问题: 运行代码时,尤其对于大型项目需要分析每个环节方法耗时的.每个方法前后都写计算耗时及日志打印太繁琐了,而且代码不精简. 解决: Python装饰器类似于Spring的 AOP(Aspect Or ...

  3. python装饰器教学_Python装饰器学习(九步入门)

    这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次 ...

  4. 简单介绍python装饰器

    这篇文章简单介绍一下python装饰器,希望对你们有所帮助. 简单正常python例子: def up(text):return text.upper() #转成大写 def lo(text):ret ...

  5. Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能

    Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能 目录

  6. python 装饰器示例

    python 装饰器示例 import timedef decorator(func): # 传函数def wrapper(*args, **kwargs): # 传参数(也可以传固定参数)start ...

  7. [转]python 装饰器

    以前你有没有这样一段经历:很久之前你写过一个函数,现在你突然有了个想法就是你想看看,以前那个函数在你数据集上的运行时间是多少,这时候你可以修改之前代码为它加上计时的功能,但是这样的话是不是还要大体读读 ...

  8. python装饰器与闭包_Python 装饰器和闭包

    Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...

  9. 利用世界杯,读懂 Python 装饰器

    Python 装饰器是在面试过程高频被问到的问题,装饰器也是一个非常好用的特性, 熟练掌握装饰器会让你的编程思路更加宽广,程序也更加 pythonic. 今天就结合最近的世界杯带大家理解下装饰器. 德 ...

  10. Python 装饰器记录总结 (终极版)

    Python 装饰器记录总结 (终极版) 原文链接:http://magicroc.com/2017/04/10/Python装饰器记录总结/ 装饰器是一个函数,一个用来包装函数的函数,装饰器在函数申 ...

最新文章

  1. 直播|人大高瓴周骁:时空大数据与智慧城市前沿
  2. 一种NVMe SSD友好的数据存储系统设计
  3. ROS学习(十二):ROS URDF-model_state
  4. 【PAT乙级】1085 PAT单位排行 (25 分)
  5. java读取pptx到md
  6. c linux time微秒_qt linux系统获取当前时间(精确到毫秒、微秒)-Go语言中文社区...
  7. Spring web应用最大的败笔
  8. 文本纠错pycorrector
  9. 如何用Vue实现一个全选指令
  10. Cesium多屏展示
  11. 微软 2018 Build 大会前瞻:AI、Azure、Windows 10 都在!
  12. linux php文件,如何在linux执行PHP文件
  13. c语言科学计数法输出1_e10,PAT 1024科学计数法的代码实现及错误分析(C语言)
  14. 如何理解二元函数的可导与可微?
  15. 开源软件漏洞升级步骤
  16. vue-pdf打印出现方字块乱码问题
  17. 行业了解——挂耳咖啡
  18. Allegro如何导入高清Logo、二维码、防静电标识等图片以及汉字
  19. 计算机安全模式都进不了系统,win10电脑安全模式都进不去怎么办
  20. 前端 点击复制文本 无需插件

热门文章

  1. 0113——代理模式
  2. jQuery操作radio、checkbox、select 集合
  3. Java实现HTML页面转PDF解决方案(转)
  4. 面向对象的javascript-引用、作用域、闭包、上下文--(1)
  5. python下载_安装_配置_以及第一行python程序---python工作笔记009
  6. npm的安装和更新---npm工作笔记002
  7. 常用开发术语及工具001---NGF_TPS_墨刀手机原型页面设计工具
  8. HBuilder工作笔记002---HBuilder打包IOS应用测试IOS应用
  9. SqlServe零碎要点---sqlserver如何使用日期计算,DateTime类型的格式化以及语法格式等等。
  10. RichEdit控件的使用(未完)