按照 Python 的编程原则,当一个函数被定义后,如要修改或扩展其功能应尽量避免直接修改函数定义的代码段,否则该函数在其他地方被调用时将无法正常运行。因此,当需要修改或扩展已被定义的函数的功能而不希望直接修改其代码时,可以使用装饰器。

先来看一个简单的例子:

def func1(function):

print("这里是执行function()函数之前")

def wrapper():

function()

wrapper()

print ("这里是执行function ()函数之后")

@func1

def func2():

print ("正在执行 function ()函数")

上述代码的运行结果如下所示:

>>> def func1(function):

...         print("这里是执行function()函数之前")

...         def wrapper():

...             function()

...         wrapper()

...         print ("这里是执行function()函数之后")

>>> @func1

def func2():

.    print ("正在执行 function ()函数")

这里是执行function()函数之前

正在执行 function()函数

这里是执行function()函数之后

这里

@func1

等效于

func1(func2)

在 Python 中一切皆是对象,所以装饰器本质上是一个返回函数的高阶函数。结合之前介绍的关键字参数,可以将一个函数作为其外部函数的返回值,例如:

def func1(arg = True):

def func2():

print("This is func2() function")

def func3():

print("This is func3() function")

if arg == True:

return func2

else :

return func3

func1()()

上述代码的运行结果如下所示。

>>> def func1(arg = True):

...          def func2():

...              print("This is func2() function")

...          def func3():

...              print("This is func3() function")

...          if arg == True:

...              return func2

...          else :

...              return func3

>>> func1()()

This is func2() function

可以看到,调用 func1( ) 时实际上运行了 func2( ) 函数,第二对括号是用以运行 func2( ) 函数的,如果不写这对括号,将只会得到 func2( ) 函数的引用信息,如图下所示。

>>> def func1(arg = True):

...          def func2():

...              print("This is func2() function")

...          def func3():

...              print("This is func3() function")

...          if arg == True:

...              return func2

...          else :

...              return func3

>>> func1()

.func2 at 0x0000014ED8D663A0>

装饰器也支持嵌套,嵌套的装饰器的执行顺序是从里向外,最先调用最里层的装饰器,最后调用最外层的装饰器,例如:

@a

@b

@c

def f()

pass

将按照以下顺序执行:

f = a(b(c(f)))

python3装饰器详解_Python装饰器详解相关推荐

  1. python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景

    装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...

  2. python自带装饰器详解_Python装饰器详解

    引言 装饰器简单来说是我们向一个现有的已经存在的函数或对象添加新的功能,同时呢我们又不用改变他现有的结构. 为什么我们需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye( ...

  3. python装饰器与闭包_Python 装饰器和闭包

    Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...

  4. python中的装饰器怎么运行_Python 装饰器入门(上)

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

  5. python装饰器应用论文_Python装饰器的应用场景代码总结

    装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 json/YAML 类似响应后篡改 为函数提供额外的数据 ...

  6. python装饰器传递参数_Python装饰器高级版—Python类内定义装饰器并传递self参数...

    本文重点:解决了类里面定义的装饰器,在同一个类里面使用的问题,并实现了装饰器的类属性参数传递 目录: 一.基本装饰器 二.在类里定义装饰器,装饰本类内函数 三.类装饰器 正文: 一.基本装饰器 装饰不 ...

  7. python协程详解_python协程详解

    原博文 2019-10-25 10:07 − # python协程详解 ![python协程详解](https://pic2.zhimg.com/50/v2-9f3e2152b616e89fbad86 ...

  8. python修饰器执行步骤_Python修饰器学习总结

    1.大总结,修饰器就是把被修饰的函数作为一个参数传入修饰器函数.格式如下 @修饰器函数 def 函数 修饰器函数是要至少套一个函数的,即: def xxx def yyy ... return yyy ...

  9. python描述器 触发事件_Python描述器引导(转)

    原文:http://pyzh.readthedocs.io/en/latest/Descriptor-HOW-TO-Guide.html 作者: Raymond Hettinger 联系: 翻译: h ...

最新文章

  1. python提高照片分辨率怎么调_实拍16张菊花特写照片,运用暗色调表现,其质感表现得怎么样?...
  2. AI 复活已故漫画家手冢治虫,出版新作续写传奇
  3. c++ fstream用得多不?_自动挡中的“手自一体”,其实很好用,但真正会用的不多...
  4. 【Android休眠】之PowerKey唤醒源实现【转】
  5. debug ERP initial load error
  6. 解密ControlRotation与ActorRotation
  7. ctags 基本使用方法
  8. mysql数据库函数转义函数_MySql数据库-查询、插入数据时转义函数的使用
  9. html5 lang作用,HTML5中的lang属性,zh
  10. 能跳过节假日的闹钟_苏宁小Biu智能闹钟体验:聪明好看,别具风格的“小物件”...
  11. 文字超出显示....省略显示
  12. WinAPI: 钩子回调函数之 CallWndProcRetProc
  13. 数据结构笔记(十)-- 循环队列
  14. Computer:C盘简介成功解决当Win10系统进行深度学习的时候发现系统C盘满了,教你如何正确卸载一些非必要的内容(提高磁盘内存和网速)
  15. jquery衬衣产品内容详情页
  16. 【视频】离职创业感悟
  17. csdn博客文章头部自动生成目录
  18. python输入整数输出英文_python练习 英文字符的鲁棒输入+数字的鲁棒输入
  19. 【蓝桥杯】——备战冲刺最后两周
  20. 进程间通信(无名管道)

热门文章

  1. 英特尔近日发布最新版实感™ SDK R5 (v7)
  2. 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(5)
  3. 在备份流程中使用date
  4. 树中数据间关系整理~节点关系及用途解析及常用术语整理
  5. c语言中合法的字符型常量是,C语言习题库(带答案)-排版.doc
  6. java 注解 payload_spring – 如何使用注释配置PayloadValidatingInterceptor
  7. 计算机藏文论文,计算机论文:藏文陈述句复述生成之计算机研究.docx
  8. mysql double 20_MySQL教程20-小数类型
  9. php 获取所有表,php – 获取所有插件的列表
  10. linux grep 快速,51CTO博客-专业IT技术博客创作平台-技术成就梦想