Python 装饰器自理解备忘

简单的装饰器代码(给装饰的函数有参数和返回值):

#!_*_ coding=utf-8 _*_
#!/usr/bin/env python

def outer(fun):
    def wrapper(var):
        print "装饰前"
        resulf = fun(var)
        print "装饰后"
        return resulf
    return wrapper

@outer
def Func1(var):
    print "this is Func1",var
    return "this is Func1 return"

resulf = Func1("wlw")
print resulf

执行结果:
#这是Func1经过装饰后的结果
装饰前
this is Func1 wlw
装饰后
#这是接受的函数的返回值
this is Func1 return

理解的执行流程:

1、执行def outer,此时创建outer函数并存放到内存中。

2、执行@outer,此时python会去执行第一步创建的outer函数。outer函数是需要给一个参数的,@outer会把@outer后定义的Func1该函数(创建Func1并存放到内存中)当做变量传递给outer函数。

3、开始执行outer函数,执行def wrapper,此时创建wrapper函数并存放到内存中,然后执行后续流程,return wrapper。

4、当return wrapper执行完毕后,装饰器会把返回的wrapper函数赋值给@outer后面定义的函数Func1,即Func1 = wapper。此时装饰器执行完毕。

5、当执行Func1("wlw"),因为上面装饰器已经把wrapper赋值给Func1了,此时调用Func1("wlw")相当于调用wrapper("wlw")。

6、调用wrapper后,开始执行wrapper函数,把参数"wlw"传递给wrapper函数,然后执行print "装饰前"。然后往下走调用了fun("wlw")函数,fun是在调用装饰器的时候由outer函数将Func1将参数传递进来的。即此时fun("wlw")等于Func1("wlw"),那么此时开始执行Func1("wlw"),print "this is Func1",然后执行完函数后把"this is Func1 return"当做返回值返回,即resulf="this is Func1 return"。然后把resulf当做wrapper的返回结果返回。后print"装饰后"。此时运行结果。

时间: 2024-07-30 13:50:06

Python 装饰器自理解备忘的相关文章

转发对python装饰器的理解

[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考 原文  http://blog.csdn.net/sxw3718401/article/details/39519587 主题 Python 最近写一个py脚本来整理电脑中的文档,其中需要检校输入的字符,为了不使代码冗长,想到使用装饰器. 上网搜索有关python的装饰器学习文档,主要看的是 AstralWind的一篇博文,以及Limodou的一篇文章.作为初学者,这两篇文章对新手有很大的帮助,但仍然有些不易理解的地方

[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考

最近写一个py脚本来整理电脑中的文档,其中需要检校输入的字符,为了不使代码冗长,想到使用装饰器. 上网搜索有关python的装饰器学习文档,主要看的是AstralWind的一篇博文,以及Limodou的一篇文章.作为初学者,这两篇文章对新手有很大的帮助,但仍然有些不易理解的地方.因此在此以一个初学者的认知记录一下python的装饰器的学习心得. 1. 什么是装饰器? 顾名思义,装饰器就是在方法上方标一个带有@符号的方法名,以此来对被装饰的方法进行点缀改造. 当你明白什么是装饰器之后,自然会觉得这

python @装饰器 简单理解

个人学python 好久了,但是一直是这里挑点哪里挑点那样学,有点力不从心.最近又想看看装饰器怎么用,就又研究了一下下. 简单点的: #!/usr/bin/python def say(key):                              # 创建一个小函数 print 'your first love!' return key @say def hold(): print 'this is sercod world!' hold() 简单讲一下就是   @say def hol

皇帝的新衣(python装饰器的理解和使用)

今天来说说装饰器. 在python语言中,装饰器的主要作用是减少重复输入的精髓.有了装饰器,可以非常直观而优雅的使用重复代码,就像一件衣服,可以给皇帝穿,也可以给任何人穿,只要你觉得需要这件“衣服” 语法: @装饰函数名    如@yifu  就是一个装饰器,yifu就是一个装饰函数 好吧,我们先来做一件衣服(装饰函数): def yifu(func):     #yifu是装饰函数名,func是皇帝(被装饰的函数),合起来就叫:皇帝的新衣 def gongneng(): print(“我是一个

python之我对装饰器的理解

从一开始学习python的时候,就一直不是很理解装饰器是个什么东东,再看了很多篇博文和自己动手敲了好多代码后,算是略有了解. 我理解的装饰器是: 在不改变原有函数调用的情况下,对其进行包装,使其变成另外一种函数来使用,一般的用途是 插入日志.性能测试.事务处理等. def host_restrict(tags=[], names=[]):     def decorator(f):         @functools.wraps(f)         def decorated(*args, 

对Python装饰器的个人理解方法

0.说明 在自己好好总结并对Python装饰器的执行过程进行分解之前,对于装饰器虽然理解它的基本工作方式,但对于存在复杂参数的装饰器(装饰器和函数本身都有参数),总是会感到很模糊,即使这会弄懂了,下一次也很快忘记,其实本质上还是没有多花时间去搞懂其中的细节问题. 虽然网络上已经有很多这样的文章,但显然都是别人的思想,因此自己总是记不牢,所以花点时间自己好好整理一下. 最近在对<Python核心编程>做总结,收获了不少,下面分享一下我自己对于Python装饰器的理解,后面还提供了一个较为复杂的P

【转】九步学习python装饰器

本篇日志来自:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 纯转,只字未改.只是为了学习一下装饰器.其实现在也是没有太看明白,对于装饰器我就是用的时候找例子,能蒙对,但是用过之后一段时间就忘了.还是用的少.有空应该好好看一看的,包括闭包.对于各种现代编程语言来说闭包都是很重要的.在这里先谢过原作者,如有侵权请告知. =-=-=-=-=-=-=-=-=-=-一条不怎么华丽的分隔线-=-=-=-=-=-=-=-=-=-= 这

Python装饰器详解,详细介绍它的应用场景

装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 mock.patch 函数注册 在任务中心注册一个任务 注册一个带信号处理器的函数 不同应用场景下装饰器实现 函数注册表 简单注册表 funcs = [] def register(func): funcs.append(func) return func @register def a(): r

python装饰器1

第八步:让装饰器带 类 参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 # -*- coding:gbk -*- '''示例8: 装饰器带类参数''' class locker:     def __init__(self):         print("locker.__init__() should be not called.")