理解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 相关文章推荐
django实现分页的方法
May 26 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
May 31 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
python 整数越界问题详解
Jun 27 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
keras tensorflow 实现在python下多进程运行
Feb 06 Python
Django 删除upload_to文件的步骤
Mar 30 Python
Python定时任务APScheduler原理及实例解析
May 30 Python
通过自学python能找到工作吗
Jun 21 Python
python实战之用emoji表情生成文字
May 08 Python
详解Python生成器和基于生成器的协程
Jun 03 Python
python解析照片拍摄时间进行图片整理
Jul 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环境――Appserv
2006/12/13 PHP
PHP类继承 extends使用介绍
2014/01/14 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
javascript标签在页面中的位置探讨
2013/04/11 Javascript
JavaScript通过this变量快速找出用户选中radio按钮的方法
2015/03/23 Javascript
基于JavaScript实现动态创建表格和增加表格行数
2015/12/20 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
javascript三种代码注释方法
2016/06/02 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
微信小程序 wx.uploadFile无法上传解决办法
2016/12/14 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
2019/08/26 Javascript
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
python模拟鼠标拖动操作的方法
2015/03/11 Python
Python基于pycrypto实现的AES加密和解密算法示例
2018/04/10 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
django框架创建应用操作示例
2019/09/26 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
np.dot()函数的用法详解
2020/01/17 Python
python add_argument()用法解析
2020/01/29 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
2020/07/14 Python
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
五四青年节演讲稿
2014/05/26 职场文书
对外汉语专业大学生职业生涯规划书
2014/10/11 职场文书
婚礼答谢礼品
2015/01/20 职场文书
赞助商致辞
2015/07/30 职场文书
优秀志愿者感言
2015/08/01 职场文书
图书馆义工感想
2015/08/07 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers