理解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获取当前计算机cpu数量的方法
Apr 18 Python
Python实现的爬虫功能代码
Jun 24 Python
numpy数组拼接简单示例
Dec 15 Python
Python如何抓取天猫商品详细信息及交易记录
Feb 23 Python
Django 使用Ajax进行前后台交互的示例讲解
May 28 Python
浅谈Python中eval的强大与危害
Mar 13 Python
Python新手学习装饰器
Jun 04 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
Jul 02 Python
python pymysql库的常用操作
Oct 16 Python
5分钟快速掌握Python定时任务框架的实现
Jan 26 Python
jupyter 添加不同内核的操作
Feb 06 Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
Apr 13 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中过滤非法字符的具体实现
2013/10/29 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
PHP微信开发之查询微信精选文章
2016/06/23 PHP
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
高性能Javascript笔记 数据的存储与访问性能优化
2012/08/02 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
jQuery post数据至ashx实例详解
2016/11/18 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
vue-cli 引入、配置axios的方法
2018/05/08 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
python3.7环境下安装Anaconda的教程图解
2019/09/10 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
Python接口测试get请求过程详解
2020/02/28 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
int和Integer有什么区别
2013/05/25 面试题
大队委竞选演讲稿
2014/04/28 职场文书
计算机软件专业求职信
2014/06/10 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书
个人合作协议范本
2015/08/06 职场文书
2016年优秀共青团员事迹材料
2016/02/25 职场文书
Golang二维数组的使用方式
2021/05/28 Golang
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL