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. [LC] 83. Remove Duplicates from Sorted List

    Given a sorted linked list, delete all duplicates such that each element appear only once. Example 1 ...

  2. VS2010发布,IIS实际目录,无法修改只读状态解难决办法

    VS2010发布网站后,无法修改只读状态 CMS简单的主页生成失败,其他的修改操错也应该无法执行 只在常规里修改无效. 网上得答案 1.鼠标右键点击文件夹 2.点击属性 3.在“常规”标签页中,取消“ ...

  3. <JZOJ5943>树

    一开始t了五个点我就一脸懵逼 然后 发现高级操作... 就是那个tor的数组2333 可以让一些不需要改的不再去改啦 位运算果然是神奇的东西XD 魔性哈哈哈 #include<cstdio> ...

  4. JStorm:任务调度

    前一篇文章 JStorm:概念与编程模型 介绍了JStorm的基本概念以及编程模型方面的知识,本篇主要介绍自己对JStorm的任务调度方面的认识,主要从三个方面介绍: 调度角色 调度方法 自定义调度 ...

  5. symbolicatecrash解析crash文件

    导出crash文件 Xcode -> Window -> Devices and Simulators -> View Device Logs ,然后选中导出. 找到.app文件和. ...

  6. 吴裕雄--天生自然 R语言开发学习:聚类分析(续一)

    #-------------------------------------------------------# # R in Action (2nd ed): Chapter 16 # # Clu ...

  7. <SCOI2005>互不侵犯の思路

    日常玄学dp #include<cstdio> #include<cstring> #include<iostream> #include<algorithm ...

  8. jquery关于checkbox复选框是否被选中的问题

    本人在项目中需要用到,判断哪些复选框被用户选中.自然而然想到用 if($('').attr('checked') == true) 但是不管有没有选,$('').attr('checked')返回的都 ...

  9. Jquery Ajax Post Json

    var markers = { "markers": [ { "position": "128.3657142857143", " ...

  10. php获取远程图片并把它保存到本地

    /* *功能:php多种方式完美实现下载远程图片保存到本地 *参数:文件url,保存文件名称,使用的下载方式 *当保存文件名称为空时则使用远程文件原来的名称 */ function getImage( ...