装饰器其实也就是一个函数,一个用来包装函数的函数,返回一个修改之后的函数对象。经常被用于有切面需求的场景,较为经典的有插入日志、 性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装 饰器的作用就是为已经存在的对象添加额外的功能。
首先来看看一个小例子:
<code class="language-python"><span class="k">def</span> <span class="nf">alan</span><span class="p">():</span> <span class="k">print</span><span class="p">(</span><span class="s">'alan speaking'</span><span class="p">)</span> </code>
首先我们来探讨一下这篇文章所讲的内容Inner Functions - What Are They Good For?(中文版)
使用内层函数的三个好处1.封装
<code class="language-python"><span class="k">def</span> <span class="nf">outer</span><span class="p">(</span><span class="n">num1</span><span class="p">):</span> <span class="k">def</span> <span class="nf">inner_increment</span><span class="p">(</span><span class="n">num1</span><span class="p">):</span> <span class="c"># hidden from outer code</span> <span class="k">return</span> <span class="n">num1</span> <span class="o">+</span> <span class="mi">1</span> <span class="n">num2</span> <span class="o">=</span> <span class="n">inner_increment</span><span class="p">(</span><span class="n">num1</span><span class="p">)</span> <span class="k">print</span><span class="p">(</span><span class="n">num1</span><span class="p">,</span> <span class="n">num2</span><span class="p">)</span> <span class="n">inner_increment</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="err">#不能正确运行</span> <span class="c"># outer(10) #可以正常运行</span> </code>
<code class="language-text">def addOne(func): def wraper(*args,**kwargs): saySmthing = "Result :" return saySmthing +" "+ str(func(*args,**kwargs)) return wraper @addOne def func(a,b): return a+b print(func(10,20)) </code>
装饰器是在Python 2.4中加入的,它使得函数和方法封装(接收一个函数并返回增强版本的一个函数)更容易阅读和理解。原始的使用场景是可以将方法在定义的首部将其定义为类的方法或静态方法。
常见的装饰器模式包括:
- 参数检查;
- 缓存;
- 代理;
- 上下文提供者。