深刻理解python装饰器


装饰器是程序开发中经常会⽤到的⼀个功能,⽤好了装饰器,开发效率如⻁添翼

一、示例代码

# coding=utf-8
def w1(func):
    print '--执行w1()--'
    def inner():
        print '--执行inner()--'
        func()
    print '--w1()执行结束--'
    return inner
@w1
def f1():
    print '--f1()--'

f1()

# 执行结果
--执行w1()--
--w1()执行结束--
--执行inner()--
--f1()--

二、执行过程

1.语法糖:@+函数名

python解释器就会从上到下解释代码,步骤如下:
① def w1(func): ==>将w1函数加载到内存
② @w1
从表⾯上看解释器仅仅会解释这两句代码,因为函数在没有被调⽤之前其内部代码不会被执⾏。
但是@w1这⼀句代码⾥却有⼤⽂章,@+函数名是python的⼀种语法糖

2.@w1内部执行过程

在@w1内部会执行下一步操作:
执行w1函数,并将@w1下面的函数作为w1函数的参数

@w1			# 等价于 f1=w1(f1)
def f1():   
	xxx 

此时f1已经不再指向原来的函数体,指向w1返回的新函数体。

3.python解释器执行顺序

从pthon解释器层面具体执行顺序:

def w1(func): # 将w1函数加载到内存
@w1 # 即执行w1(f1),在这里先存一个记录点,此时内存中并没有f1的定义,继续向下执行
def f1(): # 将f1函数加载到内存
@w1 # 此时才会真正执行f1 = w1(f1),将w1函数的返回值赋值给f1,f1指向新的函数体

三、补充说明

python解释器遇到函数体()才会去执行一个函数,遇到def func()func不会去执行。

最后在来看一下代码的输出结果

@w1 # 执行f1=w1(f1),w1函数被执行,所以w1函数体的的print会执行
def f1():
    print '--f1()--'

# 执行结果
--执行w1()--
--w1()执行结束--
f1() # 执行被装饰后的f1
# 执行结果
--执行inner()--
--f1()--

文章作者: LuffyKing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LuffyKing !
  目录