Python装饰器介绍

  1. 在Python中,装饰器(decorator)是在闭包的基础上发展起来的。
  2. 装饰器的实质是一个高阶函数,其参数是要装饰的函数名,其返回值是完成装饰的函数名,其作用是为已经存在的函数对象添加额外的功能,其特点是不需要对原有函数做任何代码上的变动。
  3. 装饰器在本质上也是一个嵌套函数,其外层函数的返回值是一个新的函数对象引用,所不同的是,其外层函数可以接受一个现有函数对象引用作为参数。
  4. 装饰器可以用于包装现有函数,即在不修改任何代码的前提下为现有函数增加额外功能。
  5. 装饰器通常应用于有切面(面向切面编程是指运行时动态实现程序维护的一种技术)需求的场景,例如插入日志、性能测试、事务处理、缓存以及权限校验等。
  6. 装饰器是解决这类问题的绝佳设计,有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用它们。

定义装饰器时通常会涉及以下3个函数。

1)装饰器函数:它在函数嵌套关系中作为外层函数出现,其函数体内容包括定义一个内层函数以完成装饰功能的函数,通过return语句向调用者返回内层函数对象引用。

2)目标函数:即需要进行装饰的函数,它作为装饰器函数的形参出现,该函数的定义则出现在调用装饰器的地方。

3)完成装饰的函数:它在函数嵌套关系中作为内层函数出现,用于为待装饰的目标函数添加额外功能。在这个内层函数中要调用目标函数,并为目标函数添加一些新的功能

无参装饰器

def 装饰器名称(待装饰器函数名称):
def 装饰器函数名称():
# 目标函数执行前 添加额外功能
# 目标函数调用 待装饰器函数执行
# 目标函数执行后 添加额外功能
return 装饰器函数名称 def decorator(func):
def inner(*args, **kwargs):
# func是被装饰的对象,这里可以写执行前的功能
res = func(*args, **kwargs)
# func是被装饰的对象,这里可以写执行后的功能
return inner # 使用装饰器 @装饰器名称
def 需装饰函数名称():
pass

有参装饰器

  1. 无参数装饰器本质就是一个双层结构的高阶函数,有参数装饰器则是一个3层结构的高阶函数。

def 装饰器名称(参数1, 参数2,...):
def 中间层装饰器函数名称(待装饰器函数名称)
def 里层装饰器函数名称():
# 目标函数执行前 添加额外功能
# 目标函数调用 待装饰器函数执行
# 目标函数执行后 添加额外功能
return 装饰器函数名称
return 中间层装饰器函数名称 def decorator(arg1, arg2):
def middle(func):
def inner(*args, **kwargs):
# func是被装饰的对象,这里可以写执行前的功能 可使用参数 arg1, arg2
res = func(*args, **kwargs)
# func是被装饰的对象,这里可以写执行后的功能 可使用参数 arg1, arg2
return inner
return middle # 使用装饰器 @装饰器名称(arg1, arg2)
def 需装饰函数名称():
pass

多重装饰器

  1. 多重装饰器是指使用多个装饰器来修改同一个函数。此时要注意多重装饰器的执行顺序是后面的装饰器先执行,前面的装饰器后执行,即后来者居上。

def first(func):
def inner(*args, **kwargs):
print("函数:first执行...")
func(*args, **kwargs)
print("函数:first完成")
return inner def second(func):
def inner(*args, **kwargs):
print("函数:second执行...")
func(*args, **kwargs)
print("函数:second完成")
return inner # 两装饰器应用于同一函数 @first
@second
def test():
print("函数:test执行") # 执行结果
"""
函数:first执行...
函数:second执行...
函数:test执行
函数:second完成
函数:first完成
"""

Python 装饰器(无参,有参、多重))的更多相关文章

  1. python装饰器无参及有参案例

    装饰器无参和有参案例:

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

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

  3. Python装饰器的通俗理解

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

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

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

  5. python装饰器方法

    前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...

  6. 一篇关于Python装饰器的博文

    这是一篇关于python装饰器的博文 在学习python的过程中处处受阻,之前的学习中Python的装饰器学习了好几遍也没能真正的弄懂.这一次抓住视频猛啃了一波,就连python大佬讲解装饰器起来也需 ...

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

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

  8. Python 装饰器入门(下)

    继续上次的进度:https://www.cnblogs.com/flashBoxer/p/9847521.html 正文: 装饰类 在类中有两种不通的方式使用装饰器,第一个和我们之前做过的函数非常相似 ...

  9. Python 装饰器入门(上)

    翻译前想说的话: 这是一篇介绍python装饰器的文章,对比之前看到的类似介绍装饰器的文章,个人认为无人可出其右,文章由浅到深,由函数介绍到装饰器的高级应用,每个介绍必有例子说明.文章太长,看完原文后 ...

随机推荐

  1. put out|smashed|As soon as|provided

    CONJ-SUBORD 如果:假如:只要If you say that something will happen provided or provided that something else h ...

  2. perf4j @Profiled常用写法

    以下内容大部分摘抄自网络上信息. 1.默认写法 @Profiled 日志语句形如: 2009-09-07 14:37:23,734 [main] INFO org.perf4j.TimingLogge ...

  3. perf4j+spring+aop 配置 注解方式

    今天将perf4j基于spring aop方式进入了接入,接入方法还是比较简单.具体配置如下: logback.xml <!--perf4j配置--> <appender name= ...

  4. ZooKeeper基本讲解及使用

    本文摘录于:http://blog.51cto.com/tchuairen/1859494:https://blog.csdn.net/peace1213/article/details/525714 ...

  5. python2查找匹配数据及类型转换

    判断一个字符是否包含在另一个字符串中,如果包含,但是数据类型不同,需要进行数据类型转换 下面这个是针对python2

  6. baidumap 百度地图,实现多点之间的带方向路线图。

    通过lastVisitAt判断时间先后. 通过三角函数验证角度 再由baidumap 会制线段 绘制三角箭头 比较难看…… 测试个人 因为框架引用baidu 有各种问题失败,为最快实现,以此页作一个独 ...

  7. 编写高质量 Objective-C 代码

    第一章 熟悉 Objective-C 第一条:了解 Objective-C 起源 Objective-C 是 C 语言动态性扩充.使用"消息结构"而非"函数调用" ...

  8. vagrant 虚拟机配置最佳实践

    Mac VirtualBox Vagrant 管理虚拟机 这篇文章定位是在理解了 vagrant 相关概念之后,教你如何灵活玩转自己的虚拟机配置 本文为 @favoorr 常用的 Mac Virtua ...

  9. 事务Transaction

    目录 为什么写这系列的文章 事务概念 ACID 并发事务导致的问题 脏读(Dirty Read) 非重复读(Nonrepeatable Read) 幻读(Phantom Reads) 丢失修改(Los ...

  10. C++走向远洋——30(六周,项目一1.0)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:fenshu.cpp * 作者:常轩 * 微信公众号:World ...