今天的任务比较繁重,因为我们要一起来学习Python中比较重要比较牛逼比较难的装饰器。

我将会和大家一起通过代码的形式来迷你银行存款取款的功能,然后通过引入装饰器来一步一步优化代码。

废话不多说梦开始撸代码。我们去ATM存款取款的过程用代码来表示大概如下(不大准确,仅仅是为了掩饰需要)

上面是按下按钮1就存款,否则则取款。

不对,存取款要输入密码啊!!!所以,我们要加密码验证代码。

可以看到,虽然实现了密码验证功能,但是代码冗余度比较高,而且现在只模拟了取款和存款功能,然而还有查询功能,转账功能等等,那么冗余度就更高了,而且相对于取款和存款函数来说,复用性没有那么高,所以我们要进一步优化代码,把验证函数写到取款和存款函数内部。

有没有什么方法,可以在不改变原函数以及原函数的调用的情况下扩展原函数的功能呢?当然是有的,这就是python中著名的装饰器。还是使用上面的代码来演示

从现在开始,上面红框的代码不再进行更改,打死也不改,我们来实现有密码验证的存取款功能。

装饰器装饰有参函数

看下面这段代码

大家看看这段代码有没有什么问题?

运行结果

看报错原因就知道,inner()函数多了一个参数。大家一定要注意一点,因为装饰器函数的返回值是inner,也就是说现在myprint是等同于inner的。

我们来改一下代码

为了使装饰器能够装饰更多函数,我们进一步优化代码。

装饰器装饰有返回值函数

如图可以看到,无论被装饰的函数有无返回值,其结果都无返回值,原因其实很简单,因为inner()函数根本就没有返回值。为了实现有返回值的函数被装饰之后仍然有返回值,需要inner函数与被装饰函数的返回值保持一致。

可以看到,有返回值的函数被装饰之后依然有返回值,没有返回值的函数被装饰之后则没有返回值,符合我们想要的结果。

双重语法糖

为了更加直观地演示双重语法糖,我就不再使用上面的例子了。

我先来定义一个函数

现在我有一个需求,我想在'python小白联盟'的上面打印一行'='和一行'*',也就是要实现这种效果。

那么应该怎么写呢?大家可能都会想到语法糖的叠加,那叠加的方式是以下哪一种呢?

我们来运行一下就知道了

可以看到,叠加的方式应该是***种,也就是说最外层的语法糖先执行。

带参数的语法糖

为了演示带参数的语法糖,我再把上面的一张图搬下来

显然,红框部分的代码冗余度比较高,我们可以使用带参的语法糖来进行简化

python装饰器详解-这是我见过最全面的Python装饰器详解!没有学不会这种说法!...相关推荐

  1. 这是我见过最全面的Python装饰器详解!没有学不会这种说法

    python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,才有点点开始明白了. 学习python中有什么不懂的地方,小编这 ...

  2. python装饰器作用和功能_这是我见过最全面的Python装饰器详解!没有学不会这种说法!...

    今天的任务比较繁重,因为我们要一起来学习Python中比较重要比较牛逼比较难的装饰器. 我将会和大家一起通过代码的形式来迷你银行存款取款的功能,然后通过引入装饰器来一步一步优化代码. 废话不多说梦开始 ...

  3. 这是我见过最全面的Python装饰器详解 没有学不会这种说法

    python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,才有点点开始明白了. 待会我将会和大家一起通过代码的形式来迷你银 ...

  4. python中的类装饰器应用场景_这是我见过最全面的Python装饰器教程了!

    装饰器(Decorators)是 Python 的一个重要部分.简单地说:他们是修改其他函数的功能的函数.他们有助于让我们的代码更简短,也更Pythonic(Python范儿).在程序开发中经常使用到 ...

  5. python十大重点_你见过的最全面的 Python 重点

    由于总结了太多的东西,所以篇幅有点长,这也是我'缝缝补补'总结了好久的东西. Py2 VS Py3print成为了函数,python2是关键字 不再有unicode对象,默认str就是unicode ...

  6. 超实用,这是我见过最全面的python入门教程,高中生不要错过

    Python 是一门开源免费.通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」. Python 类库(模块)极其丰富,这使得 Python 几乎无所不能,不管是传统的 Web 开发.PC ...

  7. 史上最全面的python学生管理系统教程(二)

    目录 序言 sqlite使用教程 python sqlite使用教程 数据库构造 学生信息表结构: 教师信息表结构: 课程成绩表结构: 教师添加课程: 学生表连接课程成绩表: 数据库语句了解 sqli ...

  8. 全面的Spring Boot配置文件详解

    全面的Spring Boot配置文件详解 Spring Boot在工作中是用到的越来越广泛了,简单方便,有了它,效率提高不知道多少倍.Spring Boot配置文件对Spring Boot来说就是入门 ...

  9. python教程鱼c_我见过最全的python教程鱼C工作室,资源教程下载

    课程名称 我见过最全的python教程鱼C工作室,资源教程下载 课程目录 [1]开发基础带安装包 0000安装包 000愉快的开始 001我和Python的第一次亲密接触 002用Python设计第一 ...

最新文章

  1. 在CentOS 6.8 x86_64上利用devtoolset搭建GCC 4.9.2和5.3.1开发环境
  2. 快速傅里叶变换_计算物理基础:第八章-快速傅里叶变换(FFT)
  3. 细说php这么难懂,挺难懂的解决方法
  4. Error:Execution failed for task ':APP:transformClassesWithDexForDebug'...
  5. LeetCode MySQL 1322. 广告效果
  6. 领域应用 | 为电商而生的知识图谱,如何感应用户需求?
  7. react实现异步插件_React-loadable实现组件进行异步加载
  8. html5实验原理,HTML5 方块碎片化实验
  9. 空格表示 java_java 正则表达式 空格怎么表示
  10. golang设计模式(第二版)
  11. 大学计算机网络实训目的,计算机专业大学生毕业实习目的
  12. ps哪个版本自带Camera Raw插件,怎么开启?
  13. Qt 实现画线笔锋效果详细原理
  14. 因一个 Bug,谷歌、GitHub、亚马逊等网站全球大范围宕机!
  15. Stream流、方法引用知识梳理
  16. Excel 美化要点
  17. 胆的功能--中医谈胆的作用
  18. SpringBoot国际化(中英文转换)
  19. Solidworks如何生成爆炸图
  20. Robot fish: bio-inspired fishlike underwater robots 阅读笔记 1

热门文章

  1. 硬盘属于计算机主机吗,电脑主机换硬盘后还是不是原来的主机?
  2. redis源码剖析(7):基础数据结构quicklist
  3. OpenCV—积分图像
  4. Introducing and integrating Hibernate(Chapter 2 of Hibernate In Action)
  5. Python3安装turtle提示错误:Command python setup.py egg_info failed with error code 1
  6. Vue源码后记-vFor列表渲染(3)
  7. Android之——AsyncTask和Handler对照
  8. CRectTracker类的使用
  9. LeetCode Single Number I / II / III
  10. UVA254 Towers of Hanoi【DFS】