理解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 相关文章推荐
详解Python3.1版本带来的核心变化
Apr 07 Python
Python实现连接postgresql数据库的方法分析
Dec 27 Python
Python3 queue队列模块详细介绍
Jan 05 Python
Python编程在flask中模拟进行Restful的CRUD操作
Dec 28 Python
Python PyInstaller库基本使用方法分析
Dec 12 Python
python实现字符串和数字拼接
Mar 02 Python
python使用ctypes库调用DLL动态链接库
Oct 22 Python
Python调用Redis的示例代码
Nov 24 Python
python 用递归实现通用爬虫解析器
Apr 16 Python
Django利用AJAX技术实现博文实时搜索
May 06 Python
python执行js代码的方法
May 13 Python
解决Tkinter中button按钮未按却主动执行command函数的问题
May 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 管理系统程序中的后门
2009/08/05 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
php读取文件内容的方法汇总
2015/01/24 PHP
PHP设计模式之PHP迭代器模式讲解
2019/03/22 PHP
javascript 显示当前系统时间代码
2009/12/28 Javascript
关于JS字符串函数String.replace()
2013/04/07 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
js改变css样式的三种方法推荐
2016/06/28 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
AngularJS 打开新的标签页实现代码
2017/09/07 Javascript
phantomjs导出html到pdf的方法总结
2017/10/19 Javascript
微信小程序的tab选项卡的实现效果
2019/05/15 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
python处理大数字的方法
2015/05/27 Python
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
2015/10/13 Python
Python 专题四 文件基础知识
2017/03/20 Python
python使用pil库实现图片合成实例代码
2018/01/20 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
Python RabbitMQ消息队列实现rpc
2018/05/30 Python
selenium+python自动化测试之鼠标和键盘事件
2019/01/23 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
python基于socket函数实现端口扫描
2020/05/28 Python
AMAVII眼镜官网:时尚和设计师太阳镜
2019/05/05 全球购物
安全生产检讨书
2014/01/21 职场文书
乡镇民主生活会发言材料
2014/10/20 职场文书
群众路线党员个人整改措施
2014/10/27 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
springboot如何初始化执行sql语句
2021/06/22 Java/Android
浅析MongoDB之安全认证
2021/06/26 MongoDB