zoukankan      html  css  js  c++  java
  • 运用python中装饰器方法来解决工作中为原有代码添加功能问题

                                                                 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号探月工程一样。需要多积累和练习!

      

  • 相关阅读:
    C 习题
    gcc
    几何视角看线性方程组解的情况
    JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
    为什么重写了equals(),还要重写hashCode()?
    关于ArrayList的越界问题?
    通过实例聊聊Java中的多态
    java异常处理实例分析
    Java: Integer用==比较时127相等128不相等的原因
    Java并发编程:Lock
  • 原文地址:https://www.cnblogs.com/123456likun/p/14062671.html
Copyright © 2011-2022 走看看