Python装饰器

实例场景:

  贵公司已经上线了一款产品,但是在发布后用户使用一段时间之后,发现产品可以做一下优化,已能达到更好的用户体验,作为开发人员的你该怎么做?

情景分析:

  1. 产品已经上线,不能轻易修改产品的代码
  2. 以最小的代价实现

实现过程分析:

  假设我们需要在产品的某些特定的函数中增加一些日志,用以在日志中记录代码在何时进入和离开该函数……

普通实现:

  可以在函数的开头与结尾处加上几行代码,用以记录的代码的进度:

def func1():
    step1
    step2
    step3
def func1():
    logger("Into func1")
    step1
    step2
    step3
    logger("Leave func1")

  分析:该种方式虽然能达到理想中的效果,但是涉及到修改了函数的源代码,一方面这样操作不安全(毕竟产品已经发布,针对代码的每一点修改都会给程序带来一定的风险),另一方面工作量比较大(假如有若干个函数都需要增加该功能……,假如增加的功能实现比较麻烦……)

装饰器方式实现

首先将需要新增加的功能定义为一个装饰器函数:

import time

def desc(func):
    def warpper(*args, **kwargs):
        logger("Into function %s at %s" % (func.__name__, time.time()))
        func()
        logger("Leave function %s at %s" % (func.__name__, time.time()))

  return warpper

  可以在原有功能函数之前使用“@装饰器”的方式来为函数扩展功能:

@desc        
def func1():
    step1
    step2
    step3

这样就可以在执行原有函数的时候具有装饰器的功能,如以下例子:

根据以上,我们可以看到,装饰器有以下特点:

装饰器的本质函数,为其他函数增加附加功能。

装饰器的原则:

  • 不能修改被装饰函数的代码。
  • 不能修改被装饰函数的调用方式。
原文地址:https://www.cnblogs.com/qianyeliange/p/8910928.html