Python  装饰器

  在实际的工作中,经常碰到领导或产品经理会提出很多甚至(变态)的产品要求,作为python开发,好不容易完成领导的需求,做出一个产品,并且经过测试成功上线。突然有一天,产品经理要求你在这个已经上线的产品中添加一些功能!这个时候就需要做到如何保证原有的代码不做轻易改动,并还能加进去新的代码来实现功能?

  在python中,给原有代码添加功能,有非常明确的方法-----装饰器

首先装饰器是什么?

  网上有装饰器的官方解释,这里博主不讨论概念,简单理解的说:装饰器本质是函数(器),它的主要作用就是为其他函数添加附加的功能

装饰器的原则?

  1.不能修改被装饰函数的源代码

  2.不能修改被装饰函数的调用方式

学习装饰器,必须要知道和熟悉的知识储备

  1.函数即变量:在python中,函数可以运用变量来表示

  2.高阶函数

  3.嵌套函数

装饰器的结构: 高阶函数+嵌套函数=装饰器



                                                                    实践是掌握的最好办法

  举例:假设我们产品代码里有两个函数时,我们需要对这两个函数添加一个功能:显示这两个函数的运行时间

1,源代码是这样:如图,架设源代码是这样的,并且打印的方式也是非常简单的打印

2,根据修改要求,这个时候会人有说,在原有函数里修改每一个函数内容做修改不就可以了?是,在原有的代码里修改来完成打印出运行时间,完全可以。但是,如果是大的生产环境下,大部分上线的产品里的函数不会这么简单,就算是你修改函数并成功,先不说实际中一个产品函数有多少,你要做多少重复性工作!万一还有人在调用这个产品里的函数,这个时候你修改了,就很容易造成他人调用出问题,,,,那你离开除就不远了(下图是修改源代码,不推荐使用)

3,如果因实际环境不能在原有的代码里做修改,那么只能做添加,这里就涉及到装饰器的应用

首先我们先加入装饰器

如上图:这里的 timer 是装饰器  test1,test2是源代码函数(这里为了方便显示,加了睡眠时间3秒,可以不加),从图中可以看出,装饰器的加入,不仅添加了两个函数的功能,还没有改变函数的调用方式,完成了要求

4,分析一下装饰器

如图:

根据文章开头概念:装饰器=高阶函数+嵌套函数

图上首先调用了一个time库,并很明确可以看出 timer 函数里嵌套了 d 函数 并return d 函数。该函数体里的内容是最终的时间减去了开始运行的时间。乍一看没什么问题,都很好理解;注意:还有一个 f() 没有说,f()  是什么?,为啥它在start_time 和 stop_time中间?

看下图:

其实 f() 是该程序运行中,代表了两个函数,每一个函数调用都要经过 f() 并被调用,简单来说,f()代表两个函数,所以,我们称之为高阶函数

5,运行看看效果

如图:

可以看出每一个函数运行后,都有显示时间,完成了要求


总    结

  装饰器的应用,非常适合工作中遇到修改代码问题的解决,并且灵活的不改变源代码的情况下完成添加功能,可以说是“优雅”的。python里还有很多方法非常有意思,这需要我们不断的去探索,去挖掘。由浅入深,一步步来,就像嫦娥5号探月工程一样。需要多积累和练习!

  

运用python中装饰器方法来解决工作中为原有代码添加功能问题的更多相关文章

  1. python装饰器方法

    前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...

  2. Python之装饰器、迭代器和生成器

    在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思 ...

  3. TypeScript 中装饰器的理解?应用场景?

    一.是什么 装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上 是一种在不改变原类和使用继承的情况下,动态地扩展对象功能 同样的,本质也不是什么高大上的结构,就是一个普通的 ...

  4. Python入门-装饰器初始

    今天我们就围绕一个来展开,那就是:装饰器 一.装饰器 在说装饰器之前,我们先说一个软件设计的原则:开闭原则,又被称为开放封闭原则,你的代码对功能的扩展是开放的,你的程序对修改源代码是封闭的,这样的软件 ...

  5. 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...

  6. python中装饰器的原理以及实现,

    python版本 3.6 1.python的装饰器说白了就是闭包函数的一种应用场景,在运用的时候我们遵循 #开放封闭原则:对修改封闭,对拓展开放 2.什么是装饰器 #装饰他人的器具,本身可以是任意可调 ...

  7. 【python】-- 类的装饰器方法、特殊成员方法

    装饰器方法 类的另外的特性,装饰器方法:静态方法(staticmethod).类方法(classmethod).属性方法(property) 一.静态方法 在方法名前加上@staticmethod装饰 ...

  8. 如何写一个Python万能装饰器,既可以装饰有参数的方法,也可以装饰无参数方法,或者有无返回值都可以装饰

    Python中的装饰器,可以有参数,可以有返回值,那么如何能让这个装饰器既可以装饰没有参数没有返回值的方法,又可以装饰有返回值或者有参数的方法呢?有一种万能装饰器,代码如下: def decorate ...

  9. 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法

    第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一.    案例说明 本节定义了类Sta ...

  10. 8.Python中装饰器是什么?

    Python中装饰器是什么? A Python decorator is a specific change that we make in Python syntax to alter functi ...

随机推荐

  1. promethues【centos7】时间同步

    Promethues和Grafana展示的监控突然消失了,服务器检查发现没什么异常. 当打开promethus网页后,发现有一个错误提示: Warning! Detected 60.44 second ...

  2. Ubuntu20.04 安装RabbitMQ 亲测可行

    添加Erlang repository: sudo add-apt-repository -y ppa:rabbitmq/rabbitmq-erlang 添加RabbitMQ repository: ...

  3. transformers 之Trainer对应的数据加载

    基础信息说明 本文以Seq2SeqTrainer作为实例,来讨论其模型训练时的数据加载方式 预训练模型:opus-mt-en-zh 数据集:本地数据集 任务:en-zh 机器翻译 数据加载 Train ...

  4. 记录下vue表单验证

    公共common文件夹下建立validate.js /* 是否邮编*/ export function validateMail(rule, value,callback) { const reg = ...

  5. CentOS7 yum设置阿里源

    1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...

  6. 066_VFPage中Js Button与controller交互方式(一)

    这种方式经常被用来,在button中处理一些逻辑,做法是在detail 页面中加一个button,对应是jS执行调用invoke controller Define a webService meth ...

  7. 用 yaml 写测试用例

    采用 excel 的方式写测试用例,格式比较死板,比较容易出错,采用 yaml / yml 格式来写用例. 首先安装 pyyaml:pip install pyyaml 建立一个 login.yaml ...

  8. CompletableFuture的thenCompose使用具体说明

    1.thenCompose 如果你还没有了解CompletableFuture或者希望再次熟悉一下,可以参考 CompletableFuture使用方法详细说明 1.1. thenCompose的特点 ...

  9. shell_Day06

    sed命令 Linux文本处理三剑客 之 sed sed stream EDite 作为行编辑器,对文本进行编辑(以行为单位进行编辑) 注意:sed编辑文件,却不改变原文件: sed的工作原理: 指定 ...

  10. shell_Day05

    交互输入 read    Python中用input()函数,进行输入: read命令同时可以定义多个变量值:而输入的内容默认以空格为分隔符,将值输入到对应的变量中: 如果默认值过多,最后所有的值都会 ...