理解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 28 Python
python中私有函数调用方法解密
Apr 29 Python
python 根据正则表达式提取指定的内容实例详解
Dec 04 Python
Python之自动获取公网IP的实例讲解
Oct 01 Python
python实现串口自动触发工作的示例
Jul 02 Python
python SVM 线性分类模型的实现
Jul 19 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 Python
python实现大学人员管理系统
Oct 25 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
python实现简单遗传算法
Sep 18 Python
python解包用法详解
Feb 17 Python
pytorch fine-tune 预训练的模型操作
Jun 03 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
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
jquery选择器之内容过滤选择器详解
2014/01/27 Javascript
页面装载js及性能分析方法介绍
2014/03/21 Javascript
jQuery验证插件 Validate详解
2014/11/20 Javascript
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
2017/07/11 Javascript
解决canvas画布使用fillRect()时高度出现双倍效果的问题
2017/08/03 Javascript
JS使用tofixed与round处理数据四舍五入的区别
2017/10/25 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
vue-cli3自动消除console.log()的调试信息方式
2020/10/21 Javascript
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
Python requests库用法实例详解
2018/08/14 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
python 如何上传包到pypi
2020/12/24 Python
HTML5实现预览本地图片
2016/02/17 HTML / CSS
德国高端单身人士交友网站:ElitePartner
2018/12/02 全球购物
什么是索引指示器
2012/08/20 面试题
计算机专业毕业生求职信
2014/04/30 职场文书
倡议书格式
2014/08/30 职场文书
资料员岗位职责
2015/02/10 职场文书
办公室个人总结
2015/02/28 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
Html5调用企业微信的实现
2021/04/16 HTML / CSS
解决SpringCloud Feign传对象参数调用失败的问题
2021/06/23 Java/Android
python可视化之颜色映射详解
2021/09/15 Python
python处理json数据文件
2022/04/11 Python
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers