理解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实现简单的文件传输与MySQL备份的脚本分享
Jan 03 Python
从零开始学Python第八周:详解网络编程基础(socket)
Dec 14 Python
利用Python实现Windows定时关机功能
Mar 21 Python
基于Django的ModelForm组件(详解)
Dec 07 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
Dec 14 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
pandas的唯一值、值计数以及成员资格的示例
Jul 25 Python
python按时间排序目录下的文件实现方法
Oct 17 Python
python使用response.read()接收json数据的实例
Dec 19 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
python能做哪些生活有趣的事情
Sep 09 Python
Python爬虫实战之爬取携程评论
Jun 02 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脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
Opacity.js
2007/01/22 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
JS控制层作圆周运动的方法
2016/06/20 Javascript
JavaScript SHA512加密算法详细代码
2016/10/06 Javascript
JS数组交集、并集、差集的示例代码
2017/08/23 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
vue页面更新patch的实现示例
2020/03/25 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
Python上下文管理器全实例详解
2019/11/12 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
python默认参数调用方法解析
2020/02/09 Python
python3连接MySQL8.0的两种方式
2020/02/17 Python
python3.8.1+selenium实现登录滑块验证功能
2020/05/22 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
软件测试英文面试题
2012/10/14 面试题
会计系毕业个人自荐信格式
2013/09/23 职场文书
办公室保洁员岗位职责
2013/12/02 职场文书
材料采购员岗位职责
2013/12/17 职场文书
大学学风建设方案
2014/05/04 职场文书
大学国际贸易专业自荐信
2014/06/05 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
再读《皇帝的新衣》的读后感悟!
2019/08/07 职场文书
CSS中妙用 drop-shadow 实现线条光影效果
2021/11/11 HTML / CSS