理解python中装饰器的作用


Posted in Python onJuly 21, 2021

装饰器的作用就是用一个新函数封装旧函数(是旧函数代码不变的情况下增加功能)然后会返回一个新函数,新函数就叫做装饰器,一般为了简化装饰器会用语法糖@新函数来简化

例子:

这是一段代码,但功能太少,要对这个进行增强,但又不能改变代码。

def hello():
    return "hello world!"

现在我们的需求是要增强hello()函数的功能,希望给返回加上HTML标签,比如<i>hello world</i>,但要求我们不得改变hello()函数原来的定义。

def makeitalic(fun):#makitalic传了一个新函数
    def wrapped():#内部函数
        return "<i>"+fun()+"</i>"#要加的新功能
    return wrapped#返回的是wrapped函数功能

def hello():#对这个功能进行增强
    return "hello world!"
#makeitalic里面传入了hello函数,然后内部函数fun()函数也就相当于hello函数了
hello_2=makeitalic(hello)
#打印新函数,返回的就是<i>hello world!</i>
print(hello_2())

为了增强原函数hello的功能,定义了一个函数,它接收原函数作为参数,并返回一个新的函数,在这个返回的函数中,执行了原函数,并对原函数的功能进行了增强。

事实上,makeitalic就是一个装饰器(decorator),它封装了原函数hello,并返回了一个新函数,用于增强原函数的功能,并将其赋值给hello。

一般情况下,我们使用装饰器提供的@语法糖(Syntactic Sugar),来简化上面的操作。

####使用@语法糖
def makeitalic(fun):
    def wrapped():
        return "<i>" + fun() + "</i>"
    return wrapped

@makeitalic#使用了装饰器可以直接调用,不需要赋值了
def hello():
    return "hello world"
print(hello())#使用了装饰器可以直接调用,不需要赋值了

像上面的情况,可以动态的修改函数(或类的)功能的函数就是装饰器。本质上,它是一个高阶函数,以被装饰的函数(比如上面的hello)为参数,并返回一个包装后的函数(比如上面的wrapped)给被修饰函数(hello)。

当调用hello()函数时,hello函数的执行流程如下分析:

1.把hello函数作为参数传给@符号后面的装饰器函数。

2.然后开始执行装饰器函数,并返回一个包装了的函数,同时,改变原函数的指向,现在原函数指向了这个包装函数。

3.执行原函数,其实此时执行的是包装了的函数,所以说,装饰器增强了一个现有函数的功能,但不会改变现有函数的定义。

普通装饰器的使用形式:

@decorator
def fun():
 pass

#格式就如同下面的:

def fun():
 pass
fun = decorator(fun)#不使用语法糖要进行赋值

装饰器可以定义多个,离函数定义最近的装饰器最先被调用,比如:

@decotator_one
@decorator_two
def fun():
 pass

#格式如同下面的:

def fun():
 pass
fun = decorator_one(decorator_two(fun))

装饰器还可以带参数,比如:

@decorator(arg1, arg2)
def fun():
 pass

#格式如同下面的:

def fun():
 pass
fun = decorator(arg1, arg2)(fun)

到此这篇关于python中装饰器的作用的文章就介绍到这了,更多相关python装饰器作用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现简单的计时器功能函数
Mar 14 Python
python抓取最新博客内容并生成Rss
May 17 Python
python批量添加zabbix Screens的两个脚本分享
Jan 16 Python
详谈python在windows中的文件路径问题
Apr 28 Python
pyshp创建shp点文件的方法
Dec 31 Python
Python替换月份为英文缩写的实现方法
Jul 15 Python
python中matplotlib实现随鼠标滑动自动标注代码
Apr 23 Python
Python内置异常类型全面汇总
May 28 Python
python中如何设置代码自动提示
Jul 15 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
Sep 26 Python
python中%格式表达式实例用法
Jun 18 Python
浅谈Python数学建模之固定费用问题
Jun 23 Python
opencv检测动态物体的实现
Python爬虫中urllib3与urllib的区别是什么
python Django框架快速入门教程(后台管理)
Python编写nmap扫描工具
Jul 21 #Python
Django模型层实现多表关系创建和多表操作
Jul 21 #Python
Python基本数据类型之字符串str
Jul 21 #Python
Python中22个万用公式的小结
Jul 21 #Python
You might like
php Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
php使用GD库创建图片缩略图的方法
2015/06/10 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
学习PHP session的传递方式
2016/06/15 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
jQuery之end()和pushStack()使用介绍
2012/02/07 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
使用jQuery动态加载js脚本文件的方法
2014/04/03 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
vue中的 $slot 获取插槽的节点实例
2019/11/12 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
2020/07/01 Javascript
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
python range()函数取反序遍历sequence的方法
2018/06/25 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
基于Python实现简单学生管理系统
2020/07/24 Python
阿根廷网上配眼镜:SmartBuyGlasses阿根廷
2016/08/19 全球购物
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
学生学习总结的自我评价
2013/10/22 职场文书
婚礼证婚人证婚词
2014/01/08 职场文书
女方回门宴答谢词
2014/01/14 职场文书
2015年社区科普工作总结
2015/05/13 职场文书
孙振耀退休感言
2015/08/01 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
python实现手机推送 代码也就10行左右
2022/04/12 Python
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js