看了不少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函数的功能,是不是挺方便!!

python装饰器使用的更多相关文章

  1. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  2. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  3. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  4. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  5. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  6. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  7. 关于python装饰器(Decorators)最底层理解的一句话

    一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...

  8. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  9. Python装饰器与面向切面编程

    今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...

  10. python装饰器方法

    前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...

随机推荐

  1. 新手福音︱正则表达式小工具RegExr

    由于之前在做NLP的内容,势必会接触正则表达式,但是呢,又觉得这个学不明白- 于是,这个工具还是蛮不错的,相当于在线正则速查+验证小工具,对于我这样的新手值得去玩玩. github:https://g ...

  2. FusionCharts封装-Label

    Category.java: /** * @Title:Category.java * @Package:com.fusionchart.model * @Description:FusionChar ...

  3. SQL注入攻击三部曲之入门篇

    SQL注入攻击三部曲之入门篇 服务器安全管理员和攻击者的战争仿佛永远没有停止的时候,针对国内网站的ASP架构的SQL注入攻击又开始大行其道.本篇文章通过SQL注入攻击原理引出SQL注入攻击的实施方法, ...

  4. HTML中的select下拉框内容显示不全的解决办法

    HTML中的select下拉框内容显示不全的解决办法 今天,我遇到这样一个问题:查询栏中的下拉框中的内容过长,导致部分被覆盖了. 查询了一些资料,有的说用函数控制,有的说用事件控制,有的看不懂,有的实 ...

  5. gstreamer在Ubuntu下构建开发环境

    1,Ubuntu已经安装了gstreamer库,因此只需要再安装几个开发库即可,是 libstreamer0.-libstreamer0.-devlibstreamer0.--dbg 在新立得里选中应 ...

  6. 【原】Java学习笔记029 - 映射

    package cn.temptation; import java.util.HashMap; import java.util.Map; public class Sample01 { publi ...

  7. 教我徒弟Android开发入门(三)

    前言: 老实说,我有点不知道该讲什么了,希望看过的人能给我提提意见,感激不尽. 本期知识点: 长按事件,log的简单使用,双击退出程序功能的实现 正文: 上一期我们了解到点击事件其实就是让控件绑定一个 ...

  8. C#的动态链接库和XML配置

    今天对昨天的实例进行了改进和提高,将堆排序和冒泡排序封装在一个动态链接库中,提供函数调用和事件委托.此外加入XML进行配置,在XML中存入相关配置信息,提供一个单独的XmlClass对其进行操作,加深 ...

  9. 【原】【译文】理解storm拓扑并行度

    原文地址: http://storm.apache.org/releases/1.2.1/Understanding-the-parallelism-of-a-Storm-topology.html ...

  10. 【BZOJ4403】序列统计(组合数学,卢卡斯定理)

    [BZOJ4403]序列统计(组合数学,卢卡斯定理) 题面 Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案对10^6+3取 ...