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(八)装饰器相关推荐
- Python之装饰器
Python之装饰器 在不修改函数调用方式的前提下,也不能修改函数内部源代码!!!! 例如: 在每个季度公司发绩效,统计每个人的代码执行效率.咱们总不能是每个函数里加time模块吧. import t ...
- Python设计模式-装饰器模式
Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...
- 浅谈Django的中间件与Python的装饰器
浅谈Django的中间件 与Python的装饰器 一.原理 1.装饰器是Python的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...
- Python的装饰器
详解Python的装饰器 本文源码 https://github.com/tobyqin/python_decorator Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都 ...
- python 日志 装饰器_【Python】装饰器实现日志记录
好的日志对一个软件的重要性是显而易见的.如果函数的入口都要写一行代码来记录日志,这种方式实在是太低效了,但一直没有找到更好的方法.后来用python写一些软件,了解到python的装饰器功能时,突然人 ...
- python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景
装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...
- python 类装饰器 __set___python装饰器代替set get方法实例
对于变量的访问和设置,我们可以使用get.set方法,如下: class student: def __init__(self,name): self.__name = name def get_na ...
- 关于Python的装饰器(1)
Python的装饰器的概念,一直有点微妙.之前在StackOverflow上看过一篇感觉说明的很清楚的介绍: *A decorator must accept a function as an arg ...
- python装饰器函数-Python精进-装饰器与函数对象
本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...
- python装饰器函数-python函数装饰器
什么是装饰器 装饰器是一个可调用的对象,其参数是另一个函数(被装饰的函数).装饰器可能会: 1,处理被装饰的函数,然后把它返回 2,将其替换成另一个函数或者对象 若有个名为decorate的装饰器,则 ...
最新文章
- python绘制影像组学训练集、测试集对应的ROC曲线以及瀑布图(rad-score 瀑布图)
- python语言自学教程-3D图示Python标准自学教程入门篇
- A beginner’s guide to Cache synchronization strategies--转载
- 【DP】Table(CF232B)
- 虚拟云服务器有哪些,虚拟云主机和服务器有什么区别
- bigdecimal 科学计数转普通计数_通用计数器的应用价值
- Python 二次开发 AutoCAD 简介
- 如何查看centos系统版本以及配置信息
- android 打印机 万能驱动,打印机驱动,万能打印机驱动下载,驱动程序_万能驱动下载...
- uniapp手写_uniapp 手写 Steps 步骤条
- 深入原理64式:40 概率论公式总结
- jav常用类-时间处理相关类
- 5G标准核心内容:R15+R16(内含赠书福利)
- bzoj3238 [Ahoi2013]差异 后缀自动机
- 华为云设计语言_让开发者相见恨晚?!华为云软件开发云实现云上敏捷开发
- 特征匹配中的欧氏距离
- matlab unwrap angle,matlab之unwrap函数
- 手机打开html乱码怎么解决,打开网页出现乱码怎么办 打开网页出现乱码解决方法【详解】...
- linux 挂载 nfs 权限,救急:nfs挂载问题
- 关于ThinkPad笔记本电脑显示“电源已接通,未充电”