看了不少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. burpsuite + sqlmap 日志导出批量扫描

    http://lcx.cc/?i=4207   在burpsuite中options -->misc-->logging中选择要记录的日志来源: 一般是proxy request: 生成的 ...

  2. ubuntu 下命令行播放器mplayer 使用详解

    ubuntu 下命令行播放器mplayer 使用详解 2011-01-02 21:00:42|  分类: Linux/Unix |  标签: |字号大中小 订阅 使用 MPlayer 播放媒体文件最简 ...

  3. 嵌入式Linux引导过程之1.1——Xloader的xloader.lds

    本文中的所有代码版本都是基于ST的SpearPlus开发板的. xloader是在系统上电之后,执行完ROM中的frimware后最先开始执行的用户程序,它的体积很小,执行的功能也很简单,主要是对系统 ...

  4. R+tmcn笔记︱tmcn包的基本内容以及李舰老师R语言大会展示内容摘录

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- tmcn包目前托管在在R-forge 上开发和 ...

  5. dojo之dojox/data/CsvStore初始化

    dojo之dojox/data/CsvStore初始化 1.var csvStore = new dojox.data.CsvStore({url:"student.csv"}); ...

  6. 【译】gRPC负载均衡

    原文地址:https://github.com/grpc/grpc/blob/master/doc/load-balancing.md gRPC负载均衡 范围 本文档解释了gPRC的负载均衡的设计. ...

  7. hdu5945 Fxx and game

    单调队列学习 其实和单调栈类似 都是因为有些元素是没有价值的可以舍去 #include<bits/stdc++.h> using namespace std; #define sz(X) ...

  8. TensorLayer官方中文文档1.7.4:API – 强化学习

    API - 强化学习¶ 强化学习(增强学习)相关函数. discount_episode_rewards([rewards, gamma, mode]) Take 1D float array of ...

  9. 第十篇:Map/Reduce 工作机制分析 - 数据的流向分析

    前言 在MapReduce程序中,待处理的数据最开始是放在HDFS上的,这点无异议. 接下来,数据被会被送往一个个Map节点中去,这也无异议. 下面问题来了:数据在被Map节点处理完后,再何去何从呢? ...

  10. 【BZOJ2843】极地旅行社(Link-Cut Tree)

    [BZOJ2843]极地旅行社(Link-Cut Tree) 题面 BZOJ 题解 \(LCT\)模板题呀 没什么好说的了.. #include<iostream> #include< ...