一、

装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

二、装饰器工作原理。

遵循编程的闭合原则,在不修改原函数代码的基础上增加功能,使用装饰器是一种很好的选择。

装饰器工作基于以下两步完成:

第一步:被装饰的函数作为参数传给装饰器函数,并执行装饰器函数,返回值记作newFunction;

第二步:原函数名重新被赋值为newFunction。

def auth(fun):   #定义装饰器
def inner():
print("The test code")
fun()
print("after")
return inner @auth #相当于 f1 = auth(f1) 也叫加载装饰器
def f1(): #被装饰的函数
print("----f1执行过程----") f1() #调用函数 #执行结果为 The test code
# ----f1执行过程----
# after

当执行f1函数时,首先执行装饰器auth,并将原f1函数作为参数传递给装饰器函数,装饰器返回一个inner函数并将该函数赋值给f1,即f1() = inner()

auth 这个函数实现的功能是,接收一个函数作为参数然后返回创建的另一个函数f1()=inner(),在这个创建的函数里调用接收的函数(文字比代码绕人)

三、动态参数,装饰含有N个参数的函数。

def auth(fun):   #定义装饰器
def inner(*args,**kwargs): #定义动态参数
print("The test code")
fun(*args,**kwargs) #将动态参数传给原函数
print("after")
return inner @auth #相当于 f1 = auth(f1) 也叫加载装饰器
def f1(): #被装饰的函数
print("----f1执行过程----\n===========")
@auth
def f2(name,age):
print("f2执行过程:name is + %s; age is + %s" %(name,age))
f2("gyc",33) #执行结果为

#The test code
#f2执行过程:name is + gyc; age is + 33
#after

装饰含有不同参数个数及格式的函数,可以给装饰器定义动态参数,由装饰器将动态参数传递给原函数

四、装饰有返回值的函数。

def outer(func):      #定义装饰器
def inner(*args,**kwargs): #为inner函数定义返回值
print("执行原函数之前")
r = func(*args,**kwargs) #接受原函数的返回值
print("执行原函数之后")
return r #返回原函数的返回值
return inner
@outer
def f1():
print("f1执行过程")
@outer
def f2(name,age):
print("f2执行过程")
rst = 'name is '+name+';age is'+age
return rst r1 = f1()
print("不接受参数,且无返回值:%s"%r1) r2 = f2('gyc','')
print("接受参数,且有返回值:%s"%r2)

执行结果

五、多层装饰器(同时加载多个装饰器)

六、带参数的装饰器

带参数的装饰器更为灵活,可以接收任意函数作为参数,然后动态生成新的基础装饰器,然后用新装饰器去装饰原函数。

这样,可以指定在原函数执行前运行某一个程序,在原函数执行之后运行另一个程序。

python 装饰器的理解的更多相关文章

  1. 转发对python装饰器的理解

    [Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考   原文  http://blog.csdn.net/sxw3718401/article/details/3951958 ...

  2. python 装饰器的理解以及类装饰器

    python装饰器的作用就是在不改变原有函数结构的情况下给该函数增加一个新功能,就是不入侵到原来函数里面修改代码给其增加一个新功能 先看代码 def out(fn): def inner(*args, ...

  3. python 装饰器 (个人理解就是前置的内建函数)

    感谢有篇文件详细介绍[简单 12 步理解 Python 装饰器]http://python.jobbole.com/85056/ 1.首先介绍内建函数 2.转换为装饰器 3.执行顺序 4.装饰器实用

  4. python装饰器的理解

    学习python,发现装饰器是一个比较难理解的地方. 下面用代码来说明. 装饰器的作用是为了切面编程(AOP).这种编程在java上有很多实现方式.下面直接说明吧: 1.作为装饰器的函数至少有两个de ...

  5. 总结了11条,我对Python 装饰器的理解

    对于每一个学习 Python 的同学,想必对 @ 符号一定不陌生了,正如你所知, @ 符号是装饰器的语法糖,@符号后面的函数就是我们本文的主角:装饰器. 装饰器放在一个函数开始定义的地方,它就像一顶帽 ...

  6. 谈谈对Python装饰器的理解

    装饰器,又名函数修饰符.笔者觉得函数修饰符,这个名字更能直观的反应他的作用. 函数修饰符语法特征 :         @ + 修饰符 函数修饰符的装饰对象:        函数修饰符,就是说他修饰的是 ...

  7. Python装饰器的通俗理解

    转载:http://blog.csdn.net/u013471155 在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略 ...

  8. (一)Python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

  9. Python 装饰器学习

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

随机推荐

  1. [LeetCode] Find Right Interval 找右区间

    Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...

  2. C#文件帮助类FoderHelper

    using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; us ...

  3. 常见web攻击以及防御

    xss攻击: 跨站脚本攻击,攻击者在网页中嵌入恶意代码,当用户打开网页,脚本程序便开始在客户端的浏览器上执行,以盗取客户端cookie,用户名密码,下载执行病毒木马程序,甚至是获取客户端admin权限 ...

  4. Kinect2.0 for Mac开箱

    前段时间从米国带回来一个Kinect,坑爹地发现需要适配器才能连接电脑.于是又从微软官网下单了适配器.今天终于在Mac上把Kinect装起来跑了,与大家分享一点图片. Kinect驱动安装 Kinec ...

  5. localForage——轻松实现 Web 离线存储(转)

    localStorage 能够让你实现基本的数据存储,但它的速度慢,而且不能处理二进制数据.IndexedDB 和 WebSQL 是异步的,速度快,支持大数据集,但他们的API 使用起来有点复杂.不仅 ...

  6. cavans 详解

    http://blog.csdn.net/clh604/article/details/8536059

  7. 史上最详细的linux网卡ifcfg-eth0配置详解

    通过查资料与工作中的进行一下总结: DEVICE="eth1"   网卡名称NM_CONTROLLED="yes"      network mamager的参 ...

  8. iOS无限循环滚动scrollview

    经常有园友会问"博主,有没有图片无限滚动的Demo呀?", 正儿八经的图片滚动的Demo我这儿还真没有,今天呢就封装一个可以在项目中直接使用的图片轮播.没看过其他iOS图片无限轮播 ...

  9. nodejs异步处理

    采用Async.Q.Promise等第三方库处理异步回调 Async 安装 npm install async --save-dev

  10. ORA-01438: 值大于为此列指定的允许精度

    Number的数据声明如下:表示        作用        说明Number(p, s)        声明一个定点数        p(precision)为精度,s(scale)表示小数点 ...