按照 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)))

python装饰器详解-python装饰器详解相关推荐

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

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

  2. python装饰器由浅入深_详解Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  3. python 生成器装饰器_对Python生成器、装饰器、递归的使用详解

    1.Python生成器表达式 1).Python生成器表达式 语法格式: (expr for iter_var in iterable) (expr for iter_var in iterable ...

  4. python的装饰器迭代器与生成器_详解python中的生成器、迭代器、闭包、装饰器

    迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1|1可迭代对象 以直接作用于 for ...

  5. python装饰器详解-Python装饰器基础概念与用法详解

    本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...

  6. 详解Python的装饰器

    详解Python的装饰器 Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye( ...

  7. python装饰器函数-python装饰器1:函数装饰器详解

    先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函数 方法 类 基础:函数装饰器的表现方式 假如你已经定义了 ...

  8. python类装饰器详解-Python 装饰器详解

    开放封闭原则: 开放对扩展 封闭修改源代码 改变了人家调用方式 装饰器结构 """ 默认结构为三层!!!每层返回下一层内存地址就可以进行执行函数, 传参:语法糖中的传参可 ...

  9. python中的装饰器有哪些-python中的装饰器详解

    在了解装饰器的之前一定要先了解函数作为参数传递, 什么是函数内嵌,请参考我之前写的博客函数简介 因为在python里面,函数也是对象,也可以作为参数进行传递.python装饰器本质也是一种特殊函数,它 ...

  10. python类装饰器详解-python 中的装饰器详解

    装饰器 闭包 闭包简单的来说就是一个函数,在该函数内部再定义一个函数,并且这个内部函数用到了外部变量(即是外部函数的参数),最终这个函数返回内部函数的引用,这就是闭包. def decorator(p ...

最新文章

  1. html元素的分类有哪些?
  2. 小技巧textbox的行数
  3. 每3位新码农中就有2个是单身?来自31000人的调查报告显示……
  4. php substr 去掉前n位_PHP全栈学习笔记16
  5. 吴恩达深度学习 —— 4.2 深层网络中的前向传播
  6. windows脚本bat批处理 关闭显示器 关闭显示器脚本bat
  7. 程序员应该做的事(转自CSDN)
  8. 面部捕捉技术_为什么选择魔神运动捕捉系统?
  9. k-java游戏下载,KEmulator(JAVA手机游戏模拟器)
  10. AD5933的直流偏置和量程自动切换问题
  11. 幽灵蛛(pholcus)(四)--正则表达式学习资料
  12. 可以当零食吃的排骨——椒盐排骨
  13. 杭电考研经验贴———报考计算机专业,慎重!!!
  14. 清华操作系统课程(向勇、陈渝)笔记——第三章(一)(计算机体系结构/内存分层体系)
  15. 基于Java语言的Web在线聊天室
  16. 《数据结构》实验报告五:二叉树
  17. CCS6-28335新建工程
  18. model_zoo里面有各种预训练模型
  19. C#时间转换几秒几分钟.....前
  20. 网络安全实验室-基本关1-12

热门文章

  1. TensorFlow中RNN实现的正确打开方式(转)
  2. 面经——算法题数据输入输出
  3. 【AtCoder】ARC090
  4. 企业面试之LeetCode刷题心得
  5. Android开发技术周报 Issue#69
  6. Hadoop资源调度器
  7. 搜索总结c++ 内存泄露问题
  8. L1 - 闭包和原型链
  9. 梦里看到你为我写的情书
  10. UVA11777 Automate the Grades【水题】