Python之装饰器

Posted 小嘉欣_sunny

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之装饰器相关的知识,希望对你有一定的参考价值。

什么是装饰器?

  • 装饰器:本质上是一个Python函数(python中函数就是对象),它可以让其他函数在不需要做任何代码变动的前提下,增加额外功能,装饰器的返回值也是一个函数对象。
  • 优点   :有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
  • 装饰器就是把函数作为参数的函数。
  • 装饰器是Python2.4里引进的,所以若想使用装饰器,需要确保你的python版本>=2.4。
  • 装饰器使函数调用变慢了。

首先明白如下代码的含义:

#### 第一波 ####

def foo():
    print \'foo\'
 
foo     #表示是函数
foo()   #表示执行foo函数
 
#### 第二波 ####
def foo():
    print \'foo\'
 
foo lambda x1
 
foo()   # 执行下面的lambda表达式,而不再是原来的foo函数,因为函数 foo 被重新定义了

基于如下代码进行需求变更:

############### 基础平台提供的功能如下 ###############

def f1():
    print \'f1\'
 
def f2():
    print \'f2\'
 
def f3():
    print \'f3\'
 
def f4():
    print \'f4\' 
 
############### 业务部门A 调用基础平台提供的功能 ###############
 
f1()
f2()
f3()
f4()
 
 
在如上代码基础上,即:对基础平台的所有功能进行重构,为平台提供的所有功能添加验证机制,即:执行功能前,先进行验证。
实现方案如下(仅仅针对基础平台进行代码改动):
 
############### 基础平台提供的功能如下 ###############
 
        def w1(func):
    def inner():
        # 验证1
        # 验证2
        # 验证3
        return func()
    return inner
 
@w1
def f1():
    print \'f1\'
@w1
def f2():
    print \'f2\'
@w1
def f3():
    print \'f3\'
@w1
def f4():
    print \'f4\'

 针对上述修改,以f1为例,做详细分析:

def w1(func):
    def inner():
        # 验证1
        # 验证2
        # 验证3
        return func()
    return inner
 
@w1
def f1():
    print \'f1\'
 
python解释器会从上到下解释代码,步骤如下:
  1. def w1(func):  ==>将w1函数加载到内存
  2. @w1

没错,从表面上看解释器仅仅会解释这两句代码,因为函数在没有被调用之前其内部代码不会被执行@函数名 是python的一种语法糖。

@w1
def f1():
    print \'f1\' 
# 相当于:
def f1():
    print \'f1\' 
f1 = w1(f1)

如上例@w1内部会执行以下操作:

  • 执行w1函数,并将 @w1 下面的 函数 作为w1函数的参数,即:@w1 等价于 w1(f1)
    所以,内部就会去执行:
    def inner:
    #验证1/2/3
    return f1()
    return inner     # 返回的 inner,inner代表的是函数,非执行函数
    **其实就是将原来的 f1 函数塞进另外一个函数中**
  • 将执行完的 w1 函数返回值赋值给@w1下面的函数的函数名
    w1函数的返回值是:
    def inner:
    #验证
    return 原来f1()  # 此处的 f1 表示原来的f1函数
    然后,将此返回值再重新赋值给 f1,即:
    新f1 = def inner:
    #验证
    return 原来f1()
    所以,以后业务部门想要执行 f1 函数时,就会执行 新f1 函数,在新f1 函数内部先执行验证,再执行原来的f1函数, 即执行了验证的功能,又执行了原来f1函数的内容。

一个函数可以被多个装饰器装饰吗?

@a

@b

@c

def f ():

# 相当于

f = a(b(c(f)))

 

参考文档:https://www.cnblogs.com/2014-02-17/p/7070510.html

                   http://python.jobbole.com/86632/

以上是关于Python之装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python入门篇之装饰器

python之装饰器

Python之装饰器

python之函数装饰器

python-之装饰器迭代器生成器

python之装饰器