装饰器

  • 即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰,所以称为装饰器。装饰器的主要依据是闭包
  • 这里用一个案例来说明装饰器的作用:

(1)客户需要写一个通过选择不同按钮来实现发说说和发图片操作的程序,基本框架如下:

# 函数功能
# 发说说函数
def fss():print("发说说")
# 发图片函数
def ftp():print("发图片")# 业务执行代码
buttom = 2
if buttom == 1:fss()
else:ftp()

(2)这个时候,客户发来需求说在发说说或发图片之前要用户登录,则在框架中要加入用户登录功能。而在对业务代码进行修改时有三个需要遵循的规则:1.不要随意在业务执行代码中修改代码,因为代码的应用场景很多,如果在业务执行代码中修改代码,那么每个场景中都要进行修改,工作量大;2.写好的函数功能不要随意增删,这样会违背“单一职责”原则,即一个函数只实现一个功能;3.不要随意增加新的函数,这样会导致要在业务执行代码中写入该函数,违背第一条规则。根据以上三条规则,将上述代码修改如下:

# 函数功能
# 装饰器
def checkLogin(func):def inner():print("请登录...")func()return inner
# 发说说函数
def fss():print("发说说")
fss = checkLogin(fss)
# 发图片函数
def ftp():print("发图片")
ftp = checkLogin(ftp)
# 业务执行代码
buttom = 2
if buttom == 1:fss()
else:ftp()

即加入装饰器,其中利用函数名和变量名性质相同,将装饰器返回的函数重新赋值给相应的函数名,从而避免修改业务执行代码

(3)python给出一种装饰器的简化形式,即语法糖。这里装饰器的语法糖即@装饰器名,并放在要装饰的函数前即可,最终代码如下:

# 函数功能
# 装饰器
def checkLogin(func):def inner():print("请登录...")func()return inner
# 发说说函数
@checkLogin
def fss():print("发说说")
# 发图片函数
@checkLogin
def ftp():print("发图片")
# 业务执行代码
buttom = 2
if buttom == 1:fss()
else:ftp()

这里需要注意的是,使用语法糖后,装饰器的代码会在被装饰函数之前执行,这是装饰器的执行时间问题

python深入之装饰器--通过选择发说说和发图片的案例理解装饰器相关推荐

  1. 装饰器python的通俗理解_2道极好的Python算法题 | 带你透彻理解装饰器的妙用

    今天我分享两道非常好的算法题,大家耐心看完两道算法题之后,注意精华在最后,我相信大家对装饰器的理解又会更上一层楼. 1.斐波那契数列 1).这个序列非常有名,我非常喜欢这个序列(有同学问我为啥,偷偷告 ...

  2. python函数装饰嵌套_python3--函数名本质,函数嵌套,闭包,装饰器

    python函数的嵌套和作用域链 函数的嵌套调用def max2(x,y): m = x if x > y else y  # 三元运算 return m def max4(a,b,c,d): ...

  3. python 函数修饰器 父类_Python函数嵌套、回调函数、闭包、装饰器和类

    markdown内容:Python函数嵌套.回调函数.闭包.装饰器和类 一级标题:主要描述内容 二级标题:各个内容 三级标题:重要概念 一.函数嵌套 1.1.作用域和嵌套函数 LEGB查找规则的 E, ...

  4. python开发基础04-函数、递归、匿名函数、高阶函数、装饰器

    匿名函数 lamba lambda x,y,z=1:x+y+z 匿名就是没有名字 def func(x,y,z=1):return x+y+z匿名 lambda x,y,z=1:x+y+z #与函数有 ...

  5. 【Python 学习_第4周_字符编码】金角大王培训_第4周_理解装饰器_1

    一.装饰器定义 第一次使用装饰器是在编写网页测试脚本时,unittest自带的 skip装饰器,用于确定是否执行此测试用例,后期就感觉装饰器这个东西很难懂,听完老师讲课,发现是没有理解装饰器的特点和功 ...

  6. 神经网络优化器的选择_神经网络:优化器选择的重要性

    神经网络优化器的选择 When constructing a neural network, there are several optimizers available in the Keras A ...

  7. Beautiful Soup的用法(六):解析器的选择

    对html 进行解析时,Beautiful Soup 支持解析器的选取,通常来说在选择解析器的时候需要记住两个点,一个是解析时间,另一个是兼容性. Beautiful Soup 支持的解析器有四种: ...

  8. 3.2 详解优化器的选择

    文章目录 1. 什么是优化器 2. 梯度下降算法 3. 基于动量的梯度下降 4. 实用优化器的选择 4.1 Adagrad优化器 4.2 Rmsprop 4.3 AdaDelta优化器 4.4 Ada ...

  9. PostgreSQL 当有多个索引可选时,优化器如何选择

    标签 PostgreSQL , 索引 , 复合索引 , 选择 , 成本 , 优化器 背景 当一个表有很多索引时,并且一个QUERY可以使用到其中的多个索引时,数据库会如何做出选择?最终选择哪个,或者哪 ...

最新文章

  1. visualize_object_model_3d算子说明
  2. 光子筛matlab,一种振幅调制器件产生椭圆涡旋光的方法与流程
  3. 【深度学习】上海交大发布 MedMNIST 医学图像分析数据集 新基准
  4. java set path_Java Path.setEffect方法代码示例
  5. Go语言GO111MODULE设置
  6. 谷歌浏览器不能安装离线插件——可行方法
  7. 利用MSF批量打RMI漏洞
  8. db2 快速清除表中所以的数据
  9. 视图引擎smarty 一
  10. 公开封尘已久的即时通讯源码(转)
  11. python中__call__方法_Python中__call__用法实例
  12. AD7124源码 兼容AD7124-4/8 代码都经过验证 有验证的项目PCB图
  13. Oracle----MLDN
  14. CentOS 开机优化程序
  15. Java根据成绩排名次_C语言按考试成绩排名次并存储到文件中
  16. 计算机组成原理学习笔记(3.存储系统 4.指令系统)
  17. 智能门锁电路图_【干货】智能锁工作原理及技术原理分析
  18. Linux 打开文件显示: No such file or directory
  19. 使用Ezy-Slice插件实现类似Beat Saber的模型切割效果(一)
  20. ipsec与服务器协议失败,IPSEC SA无法协商成功

热门文章

  1. 万物互联来袭 你准备好迎接5G新时代了吗?
  2. Iphone手机企业邮箱收发如何设置(有图)
  3. Effective C++条款05:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls)
  4. cocos2d-js 手游解密jsc和WebSocket数据aes加密解密分析②
  5. 【python数据分析模块教程】2——pandas基础简介以及运用
  6. 向日葵连接linux无桌面,向日葵控控远程时无画面显示可能的原因及解决办法
  7. visual svn使用教程
  8. CBCT重建保姆级入门(三)
  9. 支持N个request 的 round robin arbiter
  10. (论文加源码)基于时频域特征分析和SVM分类器的DEAP脑电信号情感状态识别(matlab代码)(四分类)