理解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 version 2.7 required, which was not found in the registry
Aug 26 Python
Python操作列表之List.insert()方法的使用
May 20 Python
Python socket编程实例详解
May 27 Python
Python实现批量读取word中表格信息的方法
Jul 30 Python
python实现飞机大战
Sep 11 Python
详解python 爬取12306验证码
May 10 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
Django框架模型简单介绍与使用分析
Jul 18 Python
基于Python数据分析之pandas统计分析
Mar 03 Python
Python实现AES加密,解密的两种方法
Oct 03 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
Jan 15 Python
python爬虫用request库处理cookie的实例讲解
Feb 20 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 生成静态页面的办法与实现代码详细版
2010/02/15 PHP
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
2011/03/29 PHP
php中time()和mktime()方法的区别
2013/09/28 PHP
php获取服务器操作系统相关信息的方法
2016/10/08 PHP
jQuery循环滚动展示代码 可应用到文字和图片上
2012/05/11 Javascript
JS对select控件option选项的增删改查示例代码
2013/10/21 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
JS三级可折叠菜单实现方法
2016/02/29 Javascript
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
Javascript6中字符串的四个新用法分享
2016/09/11 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
微信小程序冒泡事件及其阻止方法实例分析
2018/12/06 Javascript
Python中的迭代器漫谈
2015/02/03 Python
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
对pandas中Series的map函数详解
2018/07/25 Python
python程序变成软件的实操方法
2019/06/24 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
清洁工表扬信
2014/01/08 职场文书
计算机相关的自我评价
2014/01/15 职场文书
上课迟到检讨书
2014/01/19 职场文书
工商管理专业自荐信
2014/06/03 职场文书
汉语言文学专业求职信
2014/06/19 职场文书
大学生求职信例文
2014/06/29 职场文书
迎国庆演讲稿
2014/09/05 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
2014年助理政工师工作总结
2014/12/19 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
2016党校学习心得体会
2016/01/07 职场文书
调研报告的主要写法
2019/04/18 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript
浅谈Vue的computed计算属性
2022/03/21 Vue.js
vue 给数组添加新对象并赋值
2022/04/20 Vue.js