一、

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

二、装饰器工作原理。

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

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

第一步:被装饰的函数作为参数传给装饰器函数,并执行装饰器函数,返回值记作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. docker学习(4) 一些常用操作

    继续docker的学习之旅,今天练习一些常用的命令: 一.镜像相关 1.1 列出本机所有镜像 docker images 后面的操作,都以ubuntu做为练习的目标. 另外:如果某些镜像文件不想要了, ...

  2. 【教程】CDQ套CDQ——四维偏序问题

    前言 上一篇文章已经介绍了简单的CDQ分治,包括经典的二维偏序和三维偏序问题,还有带修改和查询的二维/三维偏序问题.本文讲介绍多重CDQ分治的嵌套,即多维偏序问题. 四维偏序问题       给定N( ...

  3. replace和translate的用法

    select replace ('111222333444','222','888') from dual;with tmp as(select 'aabb/123\:cde工人' s from du ...

  4. 关于Array的map方法中回调函数参数的问题

    开门见山,我们先来看两个例子. var arr=['1','4','9','16']; var r=arr.map(Math.sqrt); 猜猜r的结果会是多少? 没错就是 [1,2,3,4] 我们再 ...

  5. RP

    关键印象 Base note 任务(task):一段代码. 进程(process):程序的实体,一个正在运行中的可执行文件.拥有独立的虚拟内存空间和系统资源,包括端口权限. 线程(thread):进程 ...

  6. BZOJ3932: [CQOI2015]任务查询系统

    传送门 真不知道我没学主席树之前是有什么勇气说自己高级数据结构以及学的七七八八了. 这道题应该也是算是主席树的经典运用. 刚开始脑抽了,想把(S,E,P)的处理直接在线用树状数组xjb搞搞算了.写完后 ...

  7. Android Automotive开发之一《环境: JDK7&JDK8切换 》

    http://ubuntuhandbook.org/index.php/2015/01/install-openjdk-8-ubuntu-14-04-12-04-lts/ 安装OpenJDK8 sud ...

  8. sift特征

    已经有很多博客已经将sift特征提取算法解释的很清楚了,我只是记录一些我不明白的地方,并且记录几个理解sift特征比较好的博客. 1. http://aishack.in/tutorials/sift ...

  9. UP Board 串口使用心得

    前言 原创文章,转载引用务必注明链接. 本文使用Markdown写成,为获得更好的阅读体验和正常的图片.链接,请访问我的博客: http://www.cnblogs.com/sjqlwy/p/up_s ...

  10. 关于elasticsearch和kibana的时区和日期问题

    elasticsearch原生支持date类型,json格式通过字符来表示date类型.所以在用json提交日期至elasticsearch的时候,es会隐式转换,把es认为是date类型的字符串直接 ...