1、解释
Python 装饰允许在不修改原有函数代码的基础上,动态地增加或修改函数的功能, 装饰器本质上是一个接收函数作为输入并返回一个新的包装过后的函数的对象。
所谓函数装饰器,就是在不修改原函数的前提下,来对函数的功能进行合理的扩充。
2、例子
import time
def log(func):
print('1进入log')
def wrapper(*args, **kw):
print('3进入wrapper')
print('call %s()' % func.__name__)
print('4退出wrapper')
return func(*args, **kw)
print('2退出log')
return wrapper
@log
def loga():
print('5进入loga ')
time.sleep(1)
print('6退出loga')
def a():
print('5进入a')
time.sleep(1)
print('6退出a')
# 把@log放到loga()函数的定义前面,相当于执行了语句:
# loga = log(loga)
loga()
print('x' * 20)
log_a = log(a) # 先执行赋值
log_a() # 先运行函数
3、运行结果
1进入log
2退出log
3进入wrapper
call loga()
4退出wrapper
5进入loga
6退出loga
xxxxxxxxxxxxxxxxxxxx
1进入log
2退出log
3进入wrapper
call a()
4退出wrapper
5进入a
6退出a
4、分析
loga()函数在定义时使用了函数装饰器,a()函数在定义时未使用函数装饰器
loga()在执行时,首先执行的是装饰器函数log(),且在装饰器函数log()执行过程中函数内定义的wrapper()函数被跳过了【wrapper()函数只是在log里面定义了,没有被调用——没有加括号】,在log()函数执行后被返回给了loga;其次,在执行loga()函数,需要注意的是loga已经被重新赋值为wrapper()函数,所以此时实际上执行的是wrapper()函数