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 x: x + 1
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解释器会从上到下解释代码,步骤如下:
- def w1(func): ==>将w1函数加载到内存
- @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之装饰器的主要内容,如果未能解决你的问题,请参考以下文章