理解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实现的去除win下文本文件头部BOM的代码
Feb 10 Python
简单理解Python中基于生成器的状态机
Apr 13 Python
最基础的Python的socket编程入门教程
Apr 23 Python
python用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
Python入门之三角函数atan2()函数详解
Nov 08 Python
基于python 处理中文路径的终极解决方法
Apr 12 Python
Python 多线程,threading模块,创建子线程的两种方式示例
Sep 29 Python
python 实现PIL模块在图片画线写字
May 16 Python
Python bisect模块原理及常见实例
Jun 17 Python
重构Python代码的六个实例
Nov 25 Python
如何用python开发Zeroc Ice应用
Jan 29 Python
Python带你从浅入深探究Tuple(基础篇)
May 15 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/06/25 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
php 无限级分类 获取顶级分类ID
2016/03/13 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
jquery实现输入框实时输入触发事件代码
2016/12/21 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
js for终止循环 跳出多层循环
2018/10/04 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
2019/08/27 Javascript
[44:58]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第二场
2018/04/06 DOTA
Python中Django 后台自定义表单控件
2017/03/28 Python
socket + select 完成伪并发操作的实例
2017/08/15 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
详解将Django部署到Centos7全攻略
2018/09/26 Python
Django中提供的6种缓存方式详解
2019/08/05 Python
英国、欧洲和全球租车服务:Avis英国
2016/08/29 全球购物
Camper鞋西班牙官方网上商店:西班牙马略卡岛的鞋类品牌
2019/03/14 全球购物
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
英文自荐信格式
2013/11/28 职场文书
二手书店创业计划书
2014/01/16 职场文书
九年级物理教学反思
2014/01/29 职场文书
后勤服务中心总经理工作职责
2014/03/03 职场文书
《海底世界》教学反思
2014/04/16 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
医德医风自我评价2015
2015/03/03 职场文书
2015年银行工作总结范文
2015/04/01 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
《鲁班学艺》读后感3篇
2019/11/27 职场文书
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA