【Python成长之路】python 基础篇 -- 装饰器【华为云分享】
【写在前面】
有时候看到大神们的代码,偶尔会用到@来装饰函数。当时查了资料,大致了解装饰器一般用于在不改变原函数的基础上 ,对原函数功能进行修改/增强。使用场景是:日志级别设置、权限校验、性能测试等。
在当前工作中,还没具体使用到这一神器。所以想着,先了解下装饰器的使用方法,方便以后工作时用到。
【小碎步走起来】
1、实现a+b的功能
def A(a, b):print(a + b)return a + b
if __name__ == "__main__":A(1, 2)
2、现在我想函数A不变的情况下,实现a+2+b*2的功能 -- 函数带参数或者参数数量不确定
def B(fun):def C(*args):a = args[0]+2b = args[1]*2return fun(a,b)return C
@B
def A(a, b):print(a + b)return a + b
if __name__ == "__main__":A(1, 2)输出结果:7
(1)在main函数运行A(1,2)时,先进入装饰器B中,并将a/b参数传给*args(这里args可表示不限数量的变量输入);在对参数a/b进行修改后,最后进入A函数进行 计算。
(2)函数B的入参是 fun,函数C的入参是 args,对应的实际值即为A(),(a,b)
3、在添加装饰器后,又想继续使用原函数功能 -- 装饰器带参数
def D(flag):def B(fun):def C(*args):if flag:a = args[0]+2b = args[1]*2return fun(a, b)else:return fun(*args)return Creturn B@D(flag=False)
def A(a, b):print(a + b)return a + bif __name__ == "__main__":A(1, 2)输出结果:3
通过flag字段的判断,可以实现A()原功能或者A的增加功能。
这里要注意下,在原装饰器B函数外面又加了一层函数D,为 了加深印象,可 以这样理解:
D是为 了flag参数的,B是为了A()的,C是为了a/b参数的。对应的顺序是基于flag/A/ab的上下文决定。
4、在写完函数D后,发现又想 加新功能,怎么办? -- 装饰器叠罗汉。
# coding=utf-8
# @Auther : "鹏哥贼优秀"
# @Date : 2019/10/24
# @Software : PyCharm
def D(flag):def B(fun):def C(*args):print("我是D 装饰器")print("当前输入值内容变为:", *args)if flag:a = args[0] + 2b = args[1] * 2return fun(a, b)else:return fun(*args)return Creturn Bdef E(fun):def F(*args):print("我是E 装饰器")print("当前输入值内容变为:",*args)a = args[0] + 10b = args[1] + 10return fun(a, b)return F@D(flag=True)
@E
def A(a, b):print(a + b)return a + bif __name__ == "__main__":A(1, 2)输出结果是:
我是D 装饰器
当前输入值内容变为:1 2
我是E 装饰器
当前输入值内容变为:3 4
27
当出现多个装饰器,按顺序分别进行对应功能的计算,因此根据以上示例代码,先进行装饰器D的计算,将a/b变为3/4;然后进入装饰器E的计算,将a/b变为了13/14,最后进入A()函数,并输出27。
【写在后面】
由于当前对装饰器了解不深,只是知道了大致的用法。因此先做个笔记,等以后翅膀硬了再来叨叨下。
(如果内容介绍有偏差或者不正确的地方,欢迎大家指正。)
作者:鹏哥贼优秀
@All开发者,想获取满满的技术干货吗?想了解最前沿的技术洞察吗?想得到最权威的学习认证吗?还有多维的交流平台以及有趣的有奖互动?
2020年华为开发者大会将于2月11-12日在深圳举办,这将是华为面向开发者群体的最顶级盛会,包含但不限于华为在云计算、人工智能、5G、IoT等多个领域,特别是智能计算双引擎鲲鹏和昇腾的最新创新与最佳实践,充满期待对吧,欢迎报名预约!
【Python成长之路】python 基础篇 -- 装饰器【华为云分享】相关推荐
- Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程–>错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个人 ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- python成长之路第三篇(2)_正则表达式
打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.什么是正则表达式,python中得正则简介 2.re模块的内容 3.小练习 一.什么是正则表达式(re) 正则表 ...
- 【Python成长之路】破解Boss直聘网站滑块验证
哈喽大家好,我是鹏哥. 今天要记录的内容是 -- 破解Boss直聘网站的滑块验证. -- 上 课 铃-- TuesdayBurak Yeter;Danelle Sandoval - Tuesday 1 ...
- 【Python成长之路】如何用2行代码将抖音视频设置成我的手机铃声
哈喽大家好,我是鹏哥. 今天想学习记录的内容是 -- 如何用python提取视频中的音频. ~~~上课铃~~~ 1 写在前面 本来按我的性子和精力,一周一般只想写一篇博客:但是今天在刷抖音时,发现有个 ...
- 【Python成长之路】快速理解复制、浅拷贝、深拷贝
哈喽大家好,我是鹏哥. 今天想聊聊的主题是 -- 浅拷贝/深拷贝. ~~~上课铃~~~ 赤伶HITA - 赤伶 1 写在前面 浅拷贝.深拷贝的知识点,在python笔试和面试的过程中,经常被作为考题来 ...
- Python详细介绍及使用(基础篇)
Python详细介绍及使用(基础篇) 第一章 Python基础 Python的由来:1989年,为了打发圣诞节假期,Guido开始写Python语言的编译/解释器.Python来自Guido所 ...
- 【Python成长之路】如何用python开发自己的iphone应用程序,并添加至siri指令
哈喽大家好,我是鹏哥. 今天想记录的学习主题是 -- 基于pythonista3 app开发自己的iphone应用程序. ~~~上课铃~~~ (由于今天被小伙伴推荐了这首歌,因此就应他的要求,作为此文 ...
- 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】
[写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...
最新文章
- 【ArcGIS风暴】ArcGIS 10.2字段计算器(Field Calculator)批量条件赋值用法总结
- 接口批量同步数据_千手接口平台+电商ERP,助德嵘大药房征战拼多多
- 2020年1月数据库流行度排行:从万里挑二到波澜不惊
- 有没有比python更简单的语言排名_编程语言4种更快更简单实现Python数据可视化的方法...
- NSArray 所有基础点示例
- window 创建python虚拟环境
- EasyUI-在行内进行表格的增删改操作
- 计算机基础综合知识试题及答案,计算机基础综合知识试题及答案
- PE头之IMAGE_OPTIONAL_HEADER解析
- 【有料c++题目周刊 | 第一期】希腊诸神
- 海洋cms标签-海洋cms模板标签手册-海洋cms模板标签全套
- 2010年软件业十大新闻事件
- React-Navigation的goBack()跳转到指定页面,以及不同栈之间的页面的返回操作
- 斗罗大陆服务器维护,《斗罗大陆武魂觉醒》5月20日停服维护公告
- EChat(简易聊天项目)八、Socket实现即时通信(包括部分修改)
- STEP 7 Micro/WIN V4.0 SP9 for s7-200
- 我知道你不知道,我到底知不知道?
- 计算机网络——配置DNS和WWW服务器大作业
- Android教程之名词扫盲汇总
- The Monster