理解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错误和解决方法汇总整理
Jun 03 Python
Python编写简单的HTML页面合并脚本
Jul 11 Python
Linux下为不同版本python安装第三方库
Aug 31 Python
windows下python连接oracle数据库
Jun 07 Python
python中模块的__all__属性详解
Oct 26 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 Python
python paramiko利用sftp上传目录到远程的实例
Jan 03 Python
python实现H2O中的随机森林算法介绍及其项目实战
Aug 29 Python
Python 用三行代码提取PDF表格数据
Oct 13 Python
python实现简单飞行棋
Feb 06 Python
python爬虫使用正则爬取网站的实现
Aug 03 Python
Django分页器的用法你都了解吗
May 26 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模拟SQL Server的两个日期处理函数
2006/10/09 PHP
php 什么是PEAR?
2009/03/19 PHP
ecshop 批量上传(加入自定义属性)
2012/03/20 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
Yii框架分页技术实例分析
2019/08/30 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
解决JQeury显示内容没有边距内容紧挨着浏览器边线
2013/12/20 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
JavaScript简介
2015/02/15 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
2016/03/11 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
QRCode.js二维码生成并能长按识别
2018/10/16 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
Python入门_浅谈for循环、while循环
2017/05/16 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
python中re模块知识点总结
2021/01/17 Python
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
Perfumetrader荷兰:香水、化妆品和护肤品在线商店
2017/09/15 全球购物
英国景点门票网站:attractiontix
2019/08/27 全球购物
个人简历的自荐信
2013/10/23 职场文书
家长给老师的道歉信
2014/01/13 职场文书
村级换届选举方案
2014/05/10 职场文书
2014年驾驶员工作总结
2014/11/18 职场文书
2016继续教育研修日志
2015/11/13 职场文书
高中物理教学反思
2016/02/19 职场文书
索尼ICF-5900W收音机测评
2022/04/24 无线电
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技