理解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进阶教程之文本文件的读取和写入
Aug 29 Python
使用Python的Tornado框架实现一个一对一聊天的程序
Apr 25 Python
浅析Python中的多条件排序实现
Jun 07 Python
Python+微信接口实现运维报警
Aug 27 Python
200行自定义python异步非阻塞Web框架
Mar 15 Python
基于pandas将类别属性转化为数值属性的方法
Jul 25 Python
python斐波那契数列的计算方法
Sep 27 Python
在python 中实现运行多条shell命令
Jan 07 Python
flask框架单元测试原理与用法实例分析
Jul 23 Python
Python及Pycharm安装方法图文教程
Aug 05 Python
基于python实现MQTT发布订阅过程原理解析
Jul 27 Python
python 实现百度网盘非会员上传超过500个文件的方法
Jan 07 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
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
JavaScript 撑出页面文字换行
2009/06/15 Javascript
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
用Python创建声明性迷你语言的教程
2015/04/13 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
python笔记_将循环内容在一行输出的方法
2019/08/08 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
python openvc 裁剪、剪切图片 提取图片的行和列
2019/09/19 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
机械专业应届生求职信
2013/12/12 职场文书
运动会开幕式解说词
2014/02/05 职场文书
技术股份合作协议书
2014/10/05 职场文书
优秀班组事迹材料
2014/12/24 职场文书
Java基础-封装和继承
2021/07/02 Java/Android
mysql配置SSL证书登录的实现
2021/09/04 MySQL
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python