实例场景:
贵公司已经上线了一款产品,但是在发布后用户使用一段时间之后,发现产品可以做一下优化,已能达到更好的用户体验,作为开发人员的你该怎么做?
情景分析:
- 产品已经上线,不能轻易修改产品的代码
- 以最小的代价实现
实现过程分析:
假设我们需要在产品的某些特定的函数中增加一些日志,用以在日志中记录代码在何时进入和离开该函数……
普通实现:
可以在函数的开头与结尾处加上几行代码,用以记录的代码的进度:
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
这样就可以在执行原有函数的时候具有装饰器的功能,如以下例子:
根据以上,我们可以看到,装饰器有以下特点:
装饰器的本质:函数,为其他函数增加附加功能。
装饰器的原则:
- 不能修改被装饰函数的代码。
- 不能修改被装饰函数的调用方式。