【写在前面】

有时候看到大神们的代码,偶尔会用到@来装饰函数。当时查了资料,大致了解装饰器一般用于在不改变原函数的基础上 ,对原函数功能进行修改/增强。使用场景是:日志级别设置、权限校验、性能测试等。

在当前工作中,还没具体使用到这一神器。所以想着,先了解下装饰器的使用方法,方便以后工作时用到。

【小碎步走起来】

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 基础篇 -- 装饰器【华为云分享】相关推荐

  1. Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程–>错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个人 ...

  2. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  3. python成长之路第三篇(2)_正则表达式

    打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.什么是正则表达式,python中得正则简介 2.re模块的内容 3.小练习 一.什么是正则表达式(re) 正则表 ...

  4. 【Python成长之路】破解Boss直聘网站滑块验证

    哈喽大家好,我是鹏哥. 今天要记录的内容是 -- 破解Boss直聘网站的滑块验证. -- 上 课 铃-- TuesdayBurak Yeter;Danelle Sandoval - Tuesday 1 ...

  5. 【Python成长之路】如何用2行代码将抖音视频设置成我的手机铃声

    哈喽大家好,我是鹏哥. 今天想学习记录的内容是 -- 如何用python提取视频中的音频. ~~~上课铃~~~ 1 写在前面 本来按我的性子和精力,一周一般只想写一篇博客:但是今天在刷抖音时,发现有个 ...

  6. 【Python成长之路】快速理解复制、浅拷贝、深拷贝

    哈喽大家好,我是鹏哥. 今天想聊聊的主题是 -- 浅拷贝/深拷贝. ~~~上课铃~~~ 赤伶HITA - 赤伶 1 写在前面 浅拷贝.深拷贝的知识点,在python笔试和面试的过程中,经常被作为考题来 ...

  7. Python详细介绍及使用(基础篇)

    Python详细介绍及使用(基础篇) 第一章 Python基础     Python的由来:1989年,为了打发圣诞节假期,Guido开始写Python语言的编译/解释器.Python来自Guido所 ...

  8. 【Python成长之路】如何用python开发自己的iphone应用程序,并添加至siri指令

    哈喽大家好,我是鹏哥. 今天想记录的学习主题是 -- 基于pythonista3 app开发自己的iphone应用程序. ~~~上课铃~~~ (由于今天被小伙伴推荐了这首歌,因此就应他的要求,作为此文 ...

  9. 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】

    [写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...

最新文章

  1. 【ArcGIS风暴】ArcGIS 10.2字段计算器(Field Calculator)批量条件赋值用法总结
  2. 接口批量同步数据_千手接口平台+电商ERP,助德嵘大药房征战拼多多
  3. 2020年1月数据库流行度排行:从万里挑二到波澜不惊
  4. 有没有比python更简单的语言排名_编程语言4种更快更简单实现Python数据可视化的方法...
  5. NSArray 所有基础点示例
  6. window 创建python虚拟环境
  7. EasyUI-在行内进行表格的增删改操作
  8. 计算机基础综合知识试题及答案,计算机基础综合知识试题及答案
  9. PE头之IMAGE_OPTIONAL_HEADER解析
  10. 【有料c++题目周刊 | 第一期】希腊诸神
  11. 海洋cms标签-海洋cms模板标签手册-海洋cms模板标签全套
  12. 2010年软件业十大新闻事件
  13. React-Navigation的goBack()跳转到指定页面,以及不同栈之间的页面的返回操作
  14. 斗罗大陆服务器维护,《斗罗大陆武魂觉醒》5月20日停服维护公告
  15. EChat(简易聊天项目)八、Socket实现即时通信(包括部分修改)
  16. STEP 7 Micro/WIN V4.0 SP9 for s7-200
  17. 我知道你不知道,我到底知不知道?
  18. 计算机网络——配置DNS和WWW服务器大作业
  19. Android教程之名词扫盲汇总
  20. The Monster

热门文章

  1. scara机器人本体介绍
  2. Git笔记(1) 版本控制
  3. java 正規表示 group_经验分享|Java+百度AI实现人脸识别
  4. 计算机网络常见的无线传输有,第八讲 计算机网络基础.doc
  5. 计算机的系统组成说课教案,计算机系统组成说课稿.doc
  6. 动态计算未知盒子的高度
  7. 关于C++全局变量和静态变量初始化的一些总结
  8. Long Way To Go 之 Python 5 (2)
  9. 蓝桥杯 单点最短路径问题
  10. js基本函数和基本方法