码迷,mamicode.com
首页 > 编程语言 > 详细

Python之装饰器

时间:2018-01-19 13:57:11      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:lin   ==   详细分析   增加   基础上   机制   大量   添加   使用   

什么是装饰器?

  • 装饰器:本质上是一个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之装饰器

标签:lin   ==   详细分析   增加   基础上   机制   大量   添加   使用   

原文地址:https://www.cnblogs.com/sunshine-blog/p/8304217.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!