一、

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

二、装饰器工作原理。

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

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

第一步:被装饰的函数作为参数传给装饰器函数,并执行装饰器函数,返回值记作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] Third Maximum Number 第三大的数

    Given a non-empty array of integers, return the third maximum number in this array. If it does not e ...

  2. [LeetCode] Random Pick Index 随机拾取序列

    Given an array of integers with possible duplicates, randomly output the index of a given target num ...

  3. [LeetCode] Perfect Rectangle 完美矩形

    Given N axis-aligned rectangles where N > 0, determine if they all together form an exact cover o ...

  4. [LeetCode] Russian Doll Envelopes 俄罗斯娃娃信封

    You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envel ...

  5. 数组为什么可以使用linq查询

    问题引出 这视乎是个完全不必要进行讨论的话题,因为linq(这里具体是linq to objects)本来就是针对集合类型的,数组类型作为集合类型的一种当然可以使用了.不过我还是想写一下,这个问题源于 ...

  6. 重度使用示波器进行优化分析——一个DSDA项目回顾

    这是若干年前一个项目,最近有时间整理一下.回忆起来,印象最深刻的就是重度使用示波器辅助分析,进行优化. 项目背景是在原有项目3G+项目基础上,增加一颗2G+ Modem,使支持DSDA功能. 在介绍D ...

  7. 关于js解析的一点小问题

    先来看一下下面的一段代码有什么问题? <html><head><script src="./jquery.min.js"></script ...

  8. shell及脚本2——shell 环境及命令

    一.快捷键.通配符.特殊符号 1. 快捷键 CTRL+C:终止目前的命令 CTRL+D:输入结束,EOF CTRL+M:ENTER CTRL+S:暂停屏幕输出 CTRL+Q:恢复屏幕输出 CTRL+U ...

  9. Gc.Db之循序渐进

    距离上次写Gc.Db框架已经有一段时间了,最近默默对框架代码已经做了不少优化和功能,且已经提交至nuget,大家如果想使用此框架,可以通过nuget搜索:Gc.Db进行下载和安装包. 本篇文章主要是介 ...

  10. 奇异值分解 SVD

    一基本知识 A是一个m*n的矩阵,那么A的SVD分解为\(A_{mn} = U_{mm}\Sigma _{mn}V^T_{nn}\),其中\(U^TU = I\),\(V^TV = I\),UV的列向 ...