摘要 装饰器,在python中在面向过程编程的层面实现了OOP中的“装饰”设计模式!作为高阶函数的一个延生,在python中应用广泛!

python中的装饰器,是对“高阶函数”的一种延生。使用它可以对函数进行增强,这样的方式就好像是OOP中的“装饰”设计模式所体现出来的效果一样。

1,简单装饰器

先来看一个高阶函数的例子,哈,回顾一下

然后,把函数“now”用函数“log”给装饰一下,就像是这样子:

通过在函数定义时,使用“@fn”来装饰该函数,这就是python中的装饰器。

经过上面的例子,同时我们也能得到这么一个结论就是:@log == log(now)

这个,就是python装饰器最本质的东西!

于是,上面的例子,当我们直接调用“now”函数的时候就会变成这样:

那在调用函数“now”的时候,同时打印出了一条“log”信息,这样就增强了“now”的功能,这种就称为是:装饰器!

2,带参装饰器

那现在,如果你准备在调用装饰器的时候,同时可以传递一些参数,又该怎么做呢?

首先,还是要从高阶函数的角度来看,所以,可以模拟成这样子:

那上面高阶函数的写法,转换成装饰器,就应该是这样子:

然后,我么就可以直接调用函数“now”:

那这样,是不是就实现了一个带参数的装饰器呢?

其实,只要明白一点,装饰器其实也很好理解。

我们在函数“now”上,通过增加“@log”,其实就是说:在调用“now”之前,先把“now”当做参数传递到“log”方法中执行一次。然后,由于,我们后续还需要再次调用“now”,所以,传递到“log”内部的“now”必须还得再返回,那这样的一个过程,就是装饰器的“执行”过程!

3,正规的写法

上面实现的装饰器,在装饰器的内部我们直接返回了外部的那个“now”函数,那么当我们在外部手动调用“now”函数的时候就会出现函数的返回值变成了它本身,所以我们应该在装饰器的内部,显式的调用一下“now”函数,并且返回它的返回值!

首先,我们针对不带参的装饰器做一个改造。

改造的过程是这样:当我们调用装饰函数“log”的时候,它不再是直接执行,而是在其内部又定义了一个函数,然后返回这个函数。那这个过程等价于这样: @log => now = log(now);

现在,“now”函数虽然存在,但是其实它本身已经指向了不同的一个函数“wrapper”。然后当你调用这个全新的“now”的时候,其实调用的时候内部的“wrapper”函数,然后该函数打印出对应的信息,同时还调用了“最开始的那个now函数”,为了能够调用这个“最开始的now 方法”,所以需要在“wrapper”函数中去显式的调用,同时还要返回它的值,因为这个本来就是“now”方法要返回的内容!

当然,对于带参的装饰器,就可以对应的这么写:

带参数的装饰器,对于不带参的而言,只是需要再通过一层函数来包装一下而言。

备注:一定要认真理解,理解透彻,方成正道!

python(八)装饰器相关推荐

  1. Python之装饰器

    Python之装饰器 在不修改函数调用方式的前提下,也不能修改函数内部源代码!!!! 例如: 在每个季度公司发绩效,统计每个人的代码执行效率.咱们总不能是每个函数里加time模块吧. import t ...

  2. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  3. 浅谈Django的中间件与Python的装饰器

    浅谈Django的中间件 与Python的装饰器 一.原理 1.装饰器是Python的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...

  4. Python的装饰器

    详解Python的装饰器 本文源码 https://github.com/tobyqin/python_decorator Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都 ...

  5. python 日志 装饰器_【Python】装饰器实现日志记录

    好的日志对一个软件的重要性是显而易见的.如果函数的入口都要写一行代码来记录日志,这种方式实在是太低效了,但一直没有找到更好的方法.后来用python写一些软件,了解到python的装饰器功能时,突然人 ...

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

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

  7. python 类装饰器 __set___python装饰器代替set get方法实例

    对于变量的访问和设置,我们可以使用get.set方法,如下: class student: def __init__(self,name): self.__name = name def get_na ...

  8. 关于Python的装饰器(1)

    Python的装饰器的概念,一直有点微妙.之前在StackOverflow上看过一篇感觉说明的很清楚的介绍: *A decorator must accept a function as an arg ...

  9. python装饰器函数-Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

  10. python装饰器函数-python函数装饰器

    什么是装饰器 装饰器是一个可调用的对象,其参数是另一个函数(被装饰的函数).装饰器可能会: 1,处理被装饰的函数,然后把它返回 2,将其替换成另一个函数或者对象 若有个名为decorate的装饰器,则 ...

最新文章

  1. python绘制影像组学训练集、测试集对应的ROC曲线以及瀑布图(rad-score 瀑布图)
  2. python语言自学教程-3D图示Python标准自学教程入门篇
  3. A beginner’s guide to Cache synchronization strategies--转载
  4. 【DP】Table(CF232B)
  5. 虚拟云服务器有哪些,虚拟云主机和服务器有什么区别
  6. bigdecimal 科学计数转普通计数_通用计数器的应用价值
  7. Python 二次开发 AutoCAD 简介
  8. 如何查看centos系统版本以及配置信息
  9. android 打印机 万能驱动,打印机驱动,万能打印机驱动下载,驱动程序_万能驱动下载...
  10. uniapp手写_uniapp 手写 Steps 步骤条
  11. 深入原理64式:40 概率论公式总结
  12. jav常用类-时间处理相关类
  13. 5G标准核心内容:R15+R16(内含赠书福利)
  14. bzoj3238 [Ahoi2013]差异 后缀自动机
  15. 华为云设计语言_让开发者相见恨晚?!华为云软件开发云实现云上敏捷开发
  16. 特征匹配中的欧氏距离
  17. matlab unwrap angle,matlab之unwrap函数
  18. 手机打开html乱码怎么解决,打开网页出现乱码怎么办 打开网页出现乱码解决方法【详解】...
  19. linux 挂载 nfs 权限,救急:nfs挂载问题
  20. 关于ThinkPad笔记本电脑显示“电源已接通,未充电”

热门文章

  1. 蓝桥杯单片机串口通信学习提升笔记
  2. 作业:摄氏度转为华摄氏度(勿喷)
  3. Mac显示/隐藏文件夹
  4. 基于STM32的电机--电机概述
  5. 新中新身份证读卡器开发问题
  6. python3提高pip模块安装速度的方法
  7. 基于 qiankun 的微前端实践
  8. 如何运行Python程序?
  9. Dundas BI 8.0 is Crack
  10. 【独家】谁是钉钉最大的反对派?