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. charles证书安装-客户端证书

    1.iOS设置教程: 1)wifi中配置代理 2)浏览器中输入chls.pro/ssl,进行证书下载 3)证书下载成功后,设置--通用--描述文件–安装刚下载的证书 4)设置--通用--关于本机--证 ...

  2. Docker之Elastic Search&Kibana保姆级别安装

    Docker之Elastic Search&Kibana保姆级别安装: 如果觉得样式不好:跳转即可 http://www.lifengying.site/(md文件复制过来有些样式会不一样) ...

  3. iOS ProtocolBuffer使用介绍

    ProtocolBuffer 简介 Protocol Buffer 是google 的一种数据交换的格式 Protocol Buffer 和 XML.JSON一样都是结构数据序列化的工具,但它们的数据 ...

  4. react -hook 项目搭建

    1.脚手架搭建 2.清除多余文件 3.搭建项目文件列表 4.引入公共样式 5.页面构建LOGIN 6.安装路由 v5 v6有区别 7.搭建路由文件router.js 懒加载配合supence使用 8. ...

  5. flask中的线程隔离技术

    一.引入: 在无线程隔离情况下,通过线程调用函数,函数内部改变传入对象的属性值(排除非线程安全情况),都将更改传入的对象属性 1 import threading 2 3 class TestThre ...

  6. 【Java】BigDecimal

    BigDecimal转int类型 BigDecimal a=new BigDecimal(12.88); int b=a.intValue(); System.out.println(b);//b=1 ...

  7. apollo兼容mysql的时候报错Table 'apolloportaldb.hibernate_sequence' doesn't exist

    解决方案: 配置文件里加: spring.jpa.properties.hibernate.hbm2ddl.auto=update

  8. 软件工程日报二——gradle的安装与环境配置

    昨天下载了android studio 今天想要进行学习的时候,发现还需要下载gradle 一.进入官网,https://gradle.org/,点击下载 二.进入下载界面 三.选择相应的版本,点击b ...

  9. 问题记录_IDEA启动报错:Failed to create JVM. JVM Path

    问题记录_IDEA启动报错:Failed to create JVM. JVM Path 起因 下午写代码的时候感觉IDEA有点卡,不应该啊,我16G咋回卡呢,分配的内存也不小,于是又去加大内存分配, ...

  10. ES 基础操作

    集群 健康值的三种状态 Green:所有索引的所有分片均可用 primary 和 replice 均可用. Yellow 至少有一个 replice不可以用, 但是所有的 primary 正常. Re ...